Libraries used in the Project and uploading data

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.3     ✓ purrr   0.3.4
✓ tibble  3.0.3     ✓ dplyr   1.0.2
✓ tidyr   1.1.2     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.0
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(dplyr)
library(stringr)
library(svMisc)

Attaching package: ‘svMisc’

The following object is masked from ‘package:utils’:

    ?
library(ggplot2)
library(gtable)
library("ggpubr")
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
log_data <- read_csv("~/Desktop/PAE/github/data/logData.csv")

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  callerId = col_double(),
  langId = col_double(),
  callTime = col_datetime(format = ""),
  lastCallTime = col_character(),
  noCallsMade = col_double(),
  noContentListened = col_double(),
  callId = col_character(),
  eventTime = col_datetime(format = ""),
  logInfo = col_character(),
  logInfoId = col_double(),
  inSurvey = col_logical()
)
log_data_saver <- log_data

log_data <- unique(log_data)
View(per_call_df)

log_data$logInfo <- str_replace(log_data$logInfo, "  ", " ")

#MAKE IT ALL UPPER!!!

log_data$logInfo <- toupper(log_data$logInfo)

### GETTING THE DATE MONTH AND YEAR IF I WANT!!!
extractdate <- function(date) {
    day <- format(date, format="%d")
    month <- format(date, format="%m")
    year <- format(date, format="%Y")

    cbind(day, month, year)
}

#making first calls
first_call<-extractdate(log_data$callTime)


#making last call
last_day <-substr(log_data$lastCallTime, 9, 10)
last_month <- substr(log_data$lastCallTime, 6, 7)
last_year <-substr(log_data$lastCallTime, 1, 4)

log_data<-cbind(log_data, first_call,last_day,last_month,last_year)

#Converting columns to numeric
log_data$day <-as.numeric(log_data$day)
log_data$last_day <- as.numeric(log_data$last_day)
NAs introduced by coercion
log_data$month <-as.numeric(log_data$month)
log_data$last_month <- as.numeric(log_data$last_month)
NAs introduced by coercion
log_data$year <- as.numeric(log_data$year)
log_data$last_year <- as.numeric(log_data$last_year )
NAs introduced by coercion
log_data$year <- log_data$year +log_data$month/12
log_data$last_year <- log_data$last_year + log_data$last_month/12

log_data$caller_lifetime <- log_data$last_year - log_data$year

Cmd+Option+I.

Cmd+Shift+K

PRELIMINARY DISTRIBUTIONS

In this section, we display some of the basic distributions of the data including languages, total lifeetime of a given caller, colls made, content accessed, and the ratio of content listened to calls made.

Based on the graphs below, we are nervous that some of the data is not random given the incredibly high ratio for content listened to calls made, but given that the data is distributed fairly evenly across thee different graphs, we are unsure

lang_spoken <- log_data %>%
  group_by(callerId, langId) %>%
  count()

#Distribution of languages spoken
ggplot(data=lang_spoken, aes(x=langId)) +
  geom_bar()+
  labs(
    title = 'Distribution of Languages
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna',
    x = 'Language',
    y= 'count'
  )



#Distribution of time difference bewtween first and last call

lifetime<- log_data %>%
  group_by(callerId, caller_lifetime) %>%
  count()

ggplot(data=lifetime, aes(x=caller_lifetime)) +
  geom_histogram(fill='brown', color='black')+
  labs(
    title = 'Distribution of Call Lifetimes',
    x = 'Years between First and Last Call',
    y= 'count'
  )


#distribution of calls made

calls_made <- log_data %>%
  group_by(callerId, noCallsMade) %>%
  count()

ggplot(calls_made, aes(x=noCallsMade)) +
  geom_histogram(color="black", fill="blue") +
  xlim(0,350) +
  labs(
    title = 'Distribution of calls made per individual over lifetime (Outliers Excluded) \n
Min. 1st Qu.  Median  Mean   3rd Qu.    Max. 
    3.0    45.0    69.0     99.9    106.0    7110.0 ',
    x = 'Total number of calls'
  )


content_listened <- filter(log_data, grepl("CONTENT",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT MENU",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT IS NOT AVAILABLE",logInfo))

#Creating a content#_played column
content_listened$content_played <- ifelse(str_detect(content_listened$logInfo, 'CONTENT PLAYED', negate = FALSE),1,0)
content_listened$replay_request <- ifelse(str_detect(content_listened$logInfo, 'CONTENT REPLAY REQUESTED', negate = FALSE),1,0)

content_played<-aggregate(content_listened$content_played,list(content_listened$callerId), FUN=sum)
?rename
content_played <- content_played %>% 
  dplyr::rename(
    con_play = x,
    callerId = Group.1
    )

content_replay<-aggregate(content_listened$replay_request,list(content_listened$callerId), FUN=sum)
content_replay <- content_replay %>% 
 dplyr::rename(
    con_replay = x,
    callerId = Group.1
    )

content_counts <- cbind(content_played, content_replay)

content_counts$adjusted_con <- content_counts$con_play-content_counts$con_replay

content_counts$callerId <- NULL

summary(content_counts$adjusted_con)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    3.00    8.00   17.79   20.00  279.00 
#graphing the true distribution of content played
ggplot(content_counts, aes(x=adjusted_con)) +
  geom_histogram(color="black", fill="green") +
  xlim(0,100) +
  labs(
    title = 'Distribution of total Content listened to all Across all Calls (Outliers Excluded) \n
      Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    3.00    8.00   17.79   20.00  279.00 ',
    x = 'Total Content Listen Across Calls'
  )



# Getting the number of calls per person
calls_made <- log_data %>%
  dplyr::group_by(callId) %>%
  count()

calls_made_id <- log_data %>%
  dplyr::group_by(callId, callerId) %>%
  count()


#join between tables
content_ratio <- left_join(calls_made_id, content_counts,by="callerId")
content_ratio[is.na(content_ratio)] <- 0

content_ratio <- content_ratio %>%
  dplyr::group_by(callerId, con_play, con_replay, adjusted_con) %>%
  count()

content_ratio$ratio <- content_ratio$adjusted_con/content_ratio$n

summary(content_ratio$ratio)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.3968  0.8571  1.0800  1.4568 13.4000 
ggplot(content_ratio, aes(x=ratio)) +
  geom_histogram(color="black", fill="red") +
  xlim(0,2)+
  labs(
    title = 'Distribution of ratio of content listened to Calls (Outliers Excluded) \n
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     
 0.0000  0.5614  1.0000  1.2500  1.5292 13.4000 ',
    x = 'Content to Call Ratio'
  )



sum(content_ratio$n)
[1] 16445

TOP MENU

Next, we want to Breakd down the initial Menu options and delve into the distributions of the selections that the farmer can make at a different state in the IVR System

For the first analysis, we looked at the distribution of the TOP MENU in the data. This comes in as follows:

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> ASSINGED TO EXPERIMENT (OPTIONAL) –> TOP MENU

TOP MENU

  • RAIN OPTION
  • HHI OPTION (household Irrigation)
  • RESET PROFILE OPTION
  • TOP MENU REPLAY
  • LIVESTOCK OPTION
  • COVID OPTION

Please note, we are unsure of the order these are presented. For other menus, we do have the order

Below, we have visualized the number of farmers, out of our sample, that in the life time of their calling history have accessed a given TOP MENU item at least once

Additionally, we also visualized this same selection divided by language to see if the patterns of seleciont are similar or different across langaugesv

#STARTING HERE IS FOR UNIQUE CALLERS
# filtering out top Menu keys

top_menu <-filter(log_data, grepl("TOP MENU",logInfo))

#cleaning the axis
top_menu$logInfo<- str_replace(top_menu$logInfo, "TOP MENU - ", "")
top_menu$logInfo<- str_replace(top_menu$logInfo, " PRESSED", "")
top_menu$logInfo<- str_replace(top_menu$logInfo, " PRESSED", "")
top_menu$logInfo<- str_replace(top_menu$logInfo, " SELECTED", "")

top_menu <- top_menu %>%
  group_by(callerId, logInfo, langId) %>%
  count()


ggplot(top_menu, aes(logInfo)) +
  theme(axis.text.x = element_text(angle = 30, hjust =1))+
  geom_bar()+
  labs(
    title = 'Distirution of TOP MENU items selected at least once by a unique caller',
    x = 'TOP MENU options'
  )


ggplot(top_menu, aes(langId, fill = logInfo)) +
  geom_bar()+
  labs(
    title = 'Distirution of Languages divided by TOP MENU option
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna',
    x = 'Language'
  )


#STARTING HERE IS FOR UNIQUE CALLS

top_menu_call <-filter(log_data, grepl("TOP MENU",logInfo))

#cleaning the axis
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "TOP MENU - ", "")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, " PRESSED", "")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, " PRESSED", "")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, " SELECTED", "")

top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "RAIN OPTION", "1 - RAIN OPTION")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "HHI OPTION", "2 - HHI OPTION")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "LIVESTOCK OPTION", "3 - LIVESTOCK OPTION")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "COVID OPTION", "4 - COVID OPTION")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "RESET PROFILE OPTION", "\\* - RESET PROFILE")
top_menu_call$logInfo<- str_replace(top_menu_call$logInfo, "TOP MENU REPLAYED", "\\# - TOP MENU REPLAYED")

top_menu_call <- top_menu_call %>%
  group_by(callId, logInfo) %>%
  count()

top_menu_call<- top_menu_call[match(unique(top_menu_call$callId), top_menu_call$callId),]

ggplot(top_menu_call, aes(x=fct_infreq(logInfo))) +
  theme(axis.text.x = element_text(angle = 25, hjust =1))+
  geom_bar(color='black', fill='red')+
  geom_text(stat='count', aes(label=..count..), vjust=-1)+
  ylim(0,6500)+
  labs(
    title = 'Distirution of Top Menu Options Selected per Call with Number Pressed Indicated',
    x = 'Top Menu Options',
    y='Number of Calls'
  )

unique(top_menu_call$callId)
   [1] "0000ff93-9cd5-4b9a-bba1-eef70fcbd74b" "0005798b-27dd-471b-845a-fcf2e2d9f0e9" "00076a1a-760b-46b8-baf9-bf5752096ef3"
   [4] "000ebd4c-80ca-4251-b99a-a9c88d627f47" "0010440f-f3e3-4c1a-aa6a-b2ffeff505e3" "0015dc69-4442-48e1-8208-d31acb2ab398"
   [7] "001aae23-c759-459a-9ae0-252f9d80fc39" "001b9be2-caa7-46c0-be1d-3d79716e16c9" "001d34a5-53a8-4331-95d5-bda5554d4d81"
  [10] "00295f98-fcb5-43a8-8af2-f8a34711b267" "0036510b-d09d-42be-92b7-7e8b71afbb6d" "004a73b6-0bd9-4aff-9be6-55c47bd087e1"
  [13] "004aa161-3325-42ab-a278-f6387bd72d54" "004aeeb9-ce21-4901-b753-03ac2377ee97" "0054f8a8-a6f9-45c8-b1e7-f0c5b6ed899b"
  [16] "0056507b-c758-4824-82b1-f60c10744c99" "005bb898-049e-4040-b4a0-4c59527dfddc" "005d6be6-2a1f-4836-a746-64d90cd57c72"
  [19] "00671a60-e209-4ff7-9366-ae337bbb44a0" "0068cd56-27bf-4639-a0a1-9085cf91518b" "006de38a-0791-4764-a155-9e6deebb8a89"
  [22] "006eeaf8-9ddb-4e5a-b259-83aa1b642a26" "007407c0-6818-4eb5-bed9-dc60ab14c076" "00745416-4fe4-47c9-b6c5-74c8028aa556"
  [25] "00747ea6-81e7-402b-a6e8-9596e408082e" "007926da-027a-4fb8-8673-938ffc4c1a62" "007e3b5c-13cb-4a2e-b6bc-d7fb6c452558"
  [28] "0081c914-fa08-478e-a7d2-edf43b1ebd07" "00858e0e-7604-4b12-a64d-c96590704d30" "00865f77-7152-499e-8107-acb8091a1c9c"
  [31] "008672e8-c752-402c-92ad-b42dcc58ed0a" "0088a18e-c92f-4d69-93f3-be28afe69088" "008b13cc-e899-4ab7-9f3a-b90fc5469cd9"
  [34] "0090c837-44db-4f35-9fd4-7dcad2f7dea7" "009a9e0e-f7bf-437e-a223-7cccc696a884" "009e439b-aab8-49e8-b512-1b87212218f1"
  [37] "00a0cf1e-909f-4a9a-8bb5-4f2a37f9571f" "00aa4d97-ab9c-4687-8db9-32c6d756222a" "00aa7e33-deb1-40e3-bdfa-83e7617e4b8a"
  [40] "00b295f9-93d4-4cc5-adb9-16822d934fbe" "00b50d08-022f-4c48-bafe-800db93125c6" "00b56788-4cce-40d3-bfa9-85452b393f5f"
  [43] "00c005f2-2b71-4525-b498-bcb1b15d8b5e" "00c9c412-e8cc-43bf-82a5-a239e0816b2b" "00ced108-d4d1-4fc4-ab99-7b77c039c499"
  [46] "00d08205-e5c5-4f1d-b9e9-b54fe2788fb4" "00d3cea7-3eb8-4014-b437-5b0e20b91a94" "00d468c4-6324-4729-8c86-14e97bd8ab65"
  [49] "00ec5b08-04a1-45a7-bb84-a0be973da31c" "00edf9a0-ee12-4307-9f53-2d5b8e1fd171" "00f033b1-27c9-4b34-be46-61955139fcff"
  [52] "00f04842-8d7a-443f-bf9b-0bb9a516f14c" "00fda733-e205-4d67-88a8-83d470aeb2b5" "01027433-818b-47e8-a321-085829a5e18a"
  [55] "01029803-5f19-44d6-99e6-b62b50a0ea94" "0107579f-49bd-4baf-9e09-501ce0bd73a5" "0111fd2b-347a-43ee-9ae0-5fe6a58909b6"
  [58] "0114c56c-04cd-40c1-8af4-6de9e4428720" "01158708-435e-4c10-ba9c-58ca645b043c" "012e8006-4068-4ee7-8725-f5b8aeb51660"
  [61] "013c9510-f4a2-4273-8dad-258ca828610d" "01418347-1ea6-4e22-a15d-ef7278e2fe7a" "01475da0-017d-4e28-bc91-ec666935d3ad"
  [64] "014d63e2-1495-4136-b26c-623ee9c01963" "014f6245-a67f-4d46-8710-f56b702f4992" "0163aa50-2705-45ba-90c2-d07031962c44"
  [67] "01659096-65eb-42c2-9b76-00b5a312db70" "01679a5b-0777-4fd8-81b5-54b8f55dfeb9" "016a2328-230a-4611-81bd-16ab379e3cfd"
  [70] "01738a84-a07d-4ef5-84d1-35d6fd73ac77" "01777668-a6d8-4acc-a353-5ca82ce5d3aa" "01825ebf-858b-4eb3-8898-138153a4b4e3"
  [73] "018848a0-1e87-476e-913a-1e3f4ae782c5" "0194aad9-aec8-4fb3-bc4c-f3ec81a71c00" "0197a135-f390-4735-932d-4f96697b1355"
  [76] "01a474e1-68cb-4172-9bfd-c61ea288320c" "01ab4db3-c6d7-4913-ae7e-27c0f52f90f1" "01c68bce-b5f6-4767-acfa-8c16c0f08f3b"
  [79] "01c78b7b-4d6d-4dd6-9711-06fb4195a722" "01cf4c87-e639-437e-99af-7f340d8940cd" "01d365bc-ca4d-4aeb-9eb2-687f1a4aad35"
  [82] "01d831ba-cfc7-47e1-b524-bb8f1d30e373" "01e23dc9-de3c-4cfb-b8c5-c12e94d847d6" "01e40875-8f23-47e8-9716-acf1f3ee9afa"
  [85] "01f0e556-d486-49f9-bc10-865b27b92384" "01f6cc7b-5c55-4128-8a89-8d888e33a061" "01fe7d38-c0d3-4fb8-a505-5d6365a4321d"
  [88] "01ff8ac3-9f71-4f39-ac53-e6a4d3edeb8e" "02039778-d19c-4de1-92f2-0d50e77e1ee6" "0205eeb2-aaeb-49bb-a24d-b1a274cfcd7f"
  [91] "0208a18e-6cde-45d8-a6e6-7650e4e2b2e2" "0209ba22-b9fa-4db5-8015-d2b422c57e0a" "02122390-20c6-4f89-a2ff-b209c3fd0659"
  [94] "021acceb-5416-4dfe-a9ae-83d7ba5559ac" "021cc6dd-d247-41d9-a370-3edeeab02813" "02218b0d-e0c9-497f-b4a1-b5640c487eca"
  [97] "022af907-9674-4efd-bd92-433e14c24d2e" "022d171f-5053-4ffe-a057-56e7e4d6dd6b" "022dd123-16f0-43cc-83d5-d841adac544b"
 [100] "023144c6-9887-4f95-89a8-3c56f3181884" "0238c25f-6d8c-4571-bbf1-096356f0b62f" "02392fec-bda3-4d5c-9a1c-7e8089b5795c"
 [103] "02393a63-8d2c-439f-a6c3-043636e0e5d8" "023a9b01-f748-4f64-9fd2-df6cd72071f1" "02453db3-c8a4-45f1-bf77-1f29be823789"
 [106] "0245591c-84e8-49a6-916f-46b78822f061" "024bfd03-4179-40ae-9252-1ebdc4f1b8a2" "024c3e1b-0f6d-4732-bb5f-b7357fd6bf7e"
 [109] "02522bf1-4a0b-42ce-81b0-58cf6ab01a6d" "02541f94-682d-49d1-8504-7890b75ea09f" "02626380-4a9f-467a-9792-847506dccf79"
 [112] "02712b74-37c6-461b-aa09-199da1aba2b8" "02728d2a-401d-4ca0-9f41-6a5ad41a3956" "0272c7d6-74b4-4ed8-8335-23582fd60212"
 [115] "0274e9b9-2854-4970-bfb8-1e2124fcf839" "02795cca-db19-402a-a115-5164605dc798" "027980bd-dc73-4157-8c5d-dbc41ffe1fa8"
 [118] "027c4912-cfa0-46a0-97f6-7ffb842e80db" "027d0a11-e435-4d97-8ea9-179267532120" "027ee7f1-086c-4e14-8686-d51dbf08cfa0"
 [121] "02855c9a-7afe-4dc1-b259-d943502a2f9c" "028776ef-487e-4b7f-b804-20e9bd43373e" "0287eba3-71ef-419b-a20d-e2ff9fda2f83"
 [124] "02883013-1182-408b-9ec6-fdb74d293013" "02930e47-78aa-4567-a922-ffa5ecbfecd6" "02a15573-e84b-4291-8736-dc2a20040eb1"
 [127] "02a5ac63-8eaa-4389-af4d-ccc8c386fe68" "02af240a-de39-436a-bd51-fe67540e2ee0" "02b7a464-1951-4815-9991-281b5b02798a"
 [130] "02b84486-0a8b-4926-a3d4-30d06b1cf125" "02bbb22d-35ec-4f88-9b97-198015bfa571" "02bd2bbe-a7ad-442c-bebf-fd330bc51019"
 [133] "02ce1fac-3a87-4fe1-8a3c-9ebe47884a17" "02d7750a-6b72-4030-beaf-3b6806177346" "02da72b9-2f71-4f5f-8551-68f6d2f64bca"
 [136] "02df7941-ce05-48c1-9a1b-ea9254973728" "02eee3e1-7bf3-4a0d-8689-e6bdcffcd9d4" "02f0248d-de8c-4e77-8b83-cbf3922cdea7"
 [139] "02fd608c-8833-45a7-a540-ca7d42da7205" "030020b1-569e-4ee7-a2ca-aa55c438cca4" "0301729e-3cf3-4477-97c7-dc815b2c8ee2"
 [142] "0304c09e-aad4-49e4-aab0-f5a5d7cd4528" "030deda3-94a5-4689-a57b-d2e0daf3497a" "031bf681-3ff5-4798-916d-96a4c23721f5"
 [145] "031c20e5-186b-4b99-b3c3-ec60fcadcccd" "031e5ed6-e31c-42a9-8444-9e2870354fc1" "03215c38-40c5-43e7-8396-0dc40f02b72f"
 [148] "0321a293-f528-443e-978a-f068f3f6ce2e" "03224900-4f30-486c-949f-8688c32637e9" "032b3b9f-147b-49c1-aa0b-8bfb6ea7b4da"
 [151] "033493ba-1dd8-4517-a214-bac1c1d41ab2" "0336acf7-8023-4ba7-a798-682503ea5ea1" "0337db98-ee4f-41d5-9fb2-7e33cdd6ef1f"
 [154] "03448568-c3e5-4805-b8ba-72f6326da4ae" "03573bb2-2a30-492c-988e-2cac4b6997e0" "0358adad-a39a-42f8-aa16-57649b0c9ff2"
 [157] "03591e10-8987-4bb3-aa7c-7ccb71da07c0" "035bedf5-1871-48cc-9a20-a7e53a033534" "0367abb8-2a44-43f2-841e-20fb459988e4"
 [160] "036ee655-b35f-4eb3-ac19-8d39e1ec0936" "037a77b4-eb07-4f45-a16e-e37622e37593" "037a7845-6e20-4529-b8ef-ff7d088aac2b"
 [163] "037d5f74-9962-4fab-b3ef-ddbefaab1648" "03939b8e-b95a-4f61-ae55-cbda2b7545a2" "039582b6-ed55-4730-bb4a-a08ed7cc7f04"
 [166] "039fe1ff-eae3-4548-87af-a267c2c33298" "03b7b90b-a1da-42ae-987f-91da66f33670" "03b8b5ad-d559-404d-8673-d5c00fe3b7a1"
 [169] "03bb6671-43f0-4b9b-994b-a785025671a1" "03bc73c5-b26a-401a-a060-97c3cff09ac9" "03bf59f9-3f96-42f9-9b44-cc1eeb05a9f2"
 [172] "03c03ce5-b27e-4898-9d08-82f5cc095509" "03c0fcf3-6e47-4e44-a079-b3335c661f84" "03d7f6e8-e1a0-4096-8e40-b5ed5cb25cd7"
 [175] "03e83e82-1026-4713-a4ef-5ed6c4e4e9d4" "03e9dacb-b8e0-4530-a575-8f95205810d3" "03ecf6c9-d0cf-40cc-b7b0-495a3617b33b"
 [178] "03ee34b5-dd9b-447a-a457-44ec66039457" "03ee4d3a-d529-4e50-bc75-1afe3d5c0602" "03f6576e-50db-4303-965d-173442775ff6"
 [181] "0407122d-b81d-4679-b3fb-e13215ecb8aa" "040c38a3-afc9-490c-8658-81971e585bc8" "04101190-938e-46c2-a753-76e2f085f494"
 [184] "041c1a18-8c20-4503-a705-40f93bfdd88f" "041db5be-c7f4-407f-8fc8-f4a8d349bf87" "041f59fb-44df-443a-8c50-cac764d2dcfc"
 [187] "041f8583-f251-4fd1-b94b-19a9ab811c87" "0425af43-252b-4e1b-a0d8-b56eace8b40b" "042c0f93-56ba-442f-8058-c3369fc94abc"
 [190] "0430f95a-fdc0-45b5-9615-7e07a1437859" "0432c540-bba1-4d89-9d46-becbcd4c2fc2" "043f351f-5f10-42b5-933f-909dda59c09e"
 [193] "0442a16d-ad08-4824-a6a8-0e0c8adf41ce" "0444a6fb-4e7f-41f6-9c85-6688d21482fa" "04463d84-c005-49d3-9469-b04acaa588fe"
 [196] "0449e160-a6ac-48e8-ba7b-1fe5ba8cf3b2" "04501c20-6330-41f7-8d16-a8fbdf1ce2d4" "045a5687-1c6c-4340-a42d-8bbb9de7ef04"
 [199] "04607bda-73ba-4171-9c1c-a08ff498585f" "0469d044-9519-4d1d-96ea-899655efb6d0" "0469f684-5d65-40e8-bed4-918e6a05b70c"
 [202] "04724fa8-2363-43f6-9096-aa06db8ac5a8" "047e4772-5057-4e21-946c-d90dc2a8acae" "049a2094-af8a-4b2a-8144-c56b519b6d53"
 [205] "04a2b762-9484-4c6f-bcb7-7332b074d618" "04a9ba4c-8d1b-4f89-aa17-4cf777e5a37e" "04af3f52-0ba0-47a7-905a-53b7f3d68524"
 [208] "04b2a423-3c6b-4b6b-b04c-bfa9f825ef1b" "04b56455-9dca-4978-8bfa-3b66f1605416" "04bbb356-8880-4e7a-9c9a-4425002ba10c"
 [211] "04c33b30-ffa9-4e40-9507-439292bf3f7e" "04c43938-41f0-463f-8e23-85fa55c23f60" "04c52f78-c22d-454d-b5fc-b98c2ac2ac8e"
 [214] "04cb335b-a39d-4c7c-ba61-561ab06c3532" "04cb4b81-9585-49e8-9f90-dd81f2b7911b" "04d1976a-629c-45ec-b10d-6e6bcc59c0e2"
 [217] "04d608bf-b784-48b5-be61-a28604ff38d8" "04d831e5-294e-4ea0-8aa0-9c31c6e55fdb" "04e74d45-fd25-4908-a9b5-079377e996a1"
 [220] "04ebe028-8d15-4153-8b54-aeb631e52794" "04ec6ae4-21d4-40ab-bda0-5af63e410cac" "04f039d7-d5ce-43df-993a-23bb380be151"
 [223] "04f77943-4a1b-4063-983b-f443b6c4d46d" "04f78ef7-9fad-4df4-8993-616b2a33c286" "04ffc974-3ce2-4f54-ba8c-9aa7214f6b89"
 [226] "0508e0bb-c7f1-4368-b62b-24c470630487" "051253c0-f03c-4528-88fc-dd5316ea9731" "05156408-8a1a-40de-b9e2-9e0aec854c99"
 [229] "0517cbc2-8104-4098-bec1-f2873f144435" "051e594c-18a4-432a-b899-2399306c5f9c" "05257fc6-8666-4906-860b-6b1acd16151b"
 [232] "052b88d3-4539-486c-89ad-485b77918933" "052f2f2a-c931-4e4d-b72e-a7be8a138b56" "05311055-aba7-4c9d-bd61-848c8de1aff3"
 [235] "0537e701-787d-45b7-a258-877f603b83a8" "053c13c7-de42-4f8e-8a95-e6d03bbfbcd5" "054222da-866f-4776-ba80-9fa31bc5f30d"
 [238] "05432764-08d2-40d7-b727-26763caa16fa" "05466ab1-1a26-420d-8b57-0e602d64654c" "054860dc-67bd-44a3-b975-8e00826e545a"
 [241] "054b3d5a-98d0-4c50-9c4f-c4161543ffe6" "0552840e-002d-493d-93c9-82543824ee96" "05659bb2-95de-44fd-ab86-eafda375caca"
 [244] "0579b8f1-2db7-45ef-a9a0-fbb47141cb65" "05829693-c5f5-4bff-9f04-625b5405c965" "058746c9-0529-47d7-8eb1-7ad41a716d46"
 [247] "05971ff5-abc9-49fa-a1e2-b42389371f9b" "0597ce55-072f-433d-88de-4f3164d0006a" "059a017f-5798-4b17-804a-2b0478e973e8"
 [250] "05a33cfe-9f1b-426b-b3c3-b3fc811179a0" "05b21c54-fc36-42c0-b842-ec5dbaf62725" "05ce2f35-7aeb-42be-89f0-aa38c7ece5cc"
 [253] "05dbdcb6-332c-498e-bda5-3c31c163340e" "05eaad1c-d95e-4aa6-b391-73e9fbbdf7d8" "05f1c776-6d53-4ebe-8809-e434dbe026fe"
 [256] "06070d67-5446-4625-a971-718708b84568" "06112dd6-40a3-445f-9586-84e78a193a28" "062355c9-b607-424a-b052-45c0eea10f18"
 [259] "06238eeb-53fd-42e4-a43c-7e703fa5a18b" "0624f5be-d118-447e-9ab9-b96fc3a45c69" "06323182-bdfd-4aa5-8197-5e229bda2dca"
 [262] "06336a67-e9e2-4fab-99ea-51437b0052bd" "0642b9ff-71d1-4b3d-8e3c-3dd2595157fe" "064876c9-4792-4b31-a300-6132371665ed"
 [265] "065558b8-b76f-42af-a699-ef782a51e4c2" "0658ae8e-cfb4-44b1-93d7-bd29cc4e429c" "066bd0d1-9ddf-4864-9b4b-983907f362b0"
 [268] "066fefbf-5905-4ca4-8610-8a2ea7e26d60" "0673a142-54d4-499b-97e2-44b77f783461" "06763a61-ae37-4cbd-8f71-6e9e2a770086"
 [271] "067c6eeb-318b-44bd-8277-c5c18099fe9e" "067d90f4-7f68-42fe-9dc8-57d1a7829dfa" "0686a79f-9ee7-498b-ab3b-f984f9013967"
 [274] "06928c0b-f2a8-4e42-bcba-4512624174c0" "069b8ad8-76e1-4bfc-ae35-becc27c89320" "069c3d46-924b-4b6f-b7d3-7ce23ebfe69f"
 [277] "06a490fa-126b-421e-adaf-8d5fb9695b23" "06b2f128-9df3-48e4-9551-5a3130c8de41" "06b5616e-4579-4576-8119-fcf770e59f5a"
 [280] "06c728a2-10c0-4471-a7fd-4fb921e19cef" "06dc004e-a5b3-4c40-a730-7c3ebd861e4d" "06e204a9-ca2d-4d01-93ee-3da0bcabed85"
 [283] "06e4be0f-3eff-454e-a953-960e9482f378" "06e6b0ad-7fb3-4ef4-a715-3a1b6386140c" "06ecdff2-8e94-4131-b501-f7295d828fcb"
 [286] "06f42167-33d1-4093-8a57-1a15fbf93bec" "06f814d0-3d3f-4814-941d-5a9cd5ddb341" "06fc7e1d-45d6-4061-88c4-c8928c707d9f"
 [289] "06fe58d3-0472-435b-a77c-e89799bad244" "0708a415-86b2-4b9e-a2db-096840ce0cee" "070a61db-c9e5-41c8-a09a-ce74cc498853"
 [292] "070b4c7f-e1b5-4981-9596-4a2d1f02c230" "070f662d-9e7b-46a0-a14e-569ac986ad75" "0714805f-b237-4912-8835-9943453f13fd"
 [295] "071bc9a7-2103-4bf2-b74c-5a6fd9305dbd" "07295f48-e38d-45af-bc9b-574128618777" "0736a31d-34bf-4297-8d83-94af82865311"
 [298] "073db770-8226-48a0-b302-3540f7eed091" "0743792d-6067-42be-a8c3-10dce6034bb6" "0743bed5-b6a6-402d-a8dc-a6f1ebefa2f3"
 [301] "0748a2b1-e5ac-4d97-962f-e06b834eb821" "074a2e01-5bdc-4f08-aab4-3c781e385a7c" "074c125d-cb0e-4283-934d-a1f4498d5211"
 [304] "076779fb-73a7-495c-a4a1-2a07e9bafecd" "076eef9f-4461-412f-b2b6-dd2adf05d98c" "077758fe-188b-4507-84a2-c429675cba26"
 [307] "077e7d27-0d10-45ba-885e-a4ff1801ea6a" "07874e14-adb9-46fb-8db9-bdaf856c1324" "079523f5-4897-4480-ab93-f6c937943bdd"
 [310] "079a8f3e-0e5a-4139-afa4-b11b85ba54e2" "07a477f1-50f7-4e5a-a745-1d5995b1efff" "07a6a5ba-3f7e-4f97-92bf-62d2611fc9f0"
 [313] "07b2d0a5-5dde-4f64-9f20-9ad90bfbeb09" "07b397f1-31c4-48de-80a3-285cd38830b8" "07c3c656-fd0e-44c9-941c-18ea9bd6ee48"
 [316] "07cc49f3-800e-4b14-91be-0ffaccac35d7" "07cd5611-b7fb-4005-b2ae-f7a04579f8c1" "07cfbe78-36d0-42a3-91c9-7679fa96f573"
 [319] "07d2ff32-69f5-468f-a286-0089734ac10b" "07d5af5e-c3ca-4a0a-8a99-a046c3b5f331" "07d66f7f-a9c7-450b-a8cf-feab24adf91a"
 [322] "07e24ede-e024-42fb-8843-e2f7fe28e14c" "07e87fda-df6f-41a8-a252-84148825ffb6" "07ebb9a2-fa4a-4df6-b266-70543e15e8ec"
 [325] "07f0151d-74f5-41af-ac43-2a06a797971f" "07fe6df5-257d-4b9c-b08b-23a1bb364450" "08053f17-c4c2-4068-b6a5-5001275aea45"
 [328] "08083cbf-c7b5-4aa5-97bf-b8bd32b28fcd" "080ddfc9-eb5d-4fe2-81b0-13260a53fb5d" "08117236-3e60-452a-912a-5b699f70189c"
 [331] "081665e4-7729-403d-bd5f-06b0dd3aea86" "081c9556-6159-4d05-bbbe-2f9e69445488" "081c9b91-75e5-40ba-ac3e-9a988eabaf45"
 [334] "081caa5e-f821-4c98-8f5c-8dedcd3ecae2" "08256b4d-3f5a-4406-ae39-df16111d6f72" "082e7df7-cfba-4e42-85f4-1e59cfab7e29"
 [337] "083baf8c-a57a-46b7-99fe-989f2d2c8ae5" "083f0d31-4570-461c-87d5-e924403b4320" "0840e339-92e1-4be0-a3ea-b6e5b8ab05eb"
 [340] "08410752-c5ea-4d10-8c9c-ab441b34e222" "084191d2-b000-40d6-88f9-f8de86a86b25" "08479d17-d1d2-4690-845c-d678d66653dc"
 [343] "0862057d-1e14-4cb0-9f77-11dcc8f00fa5" "08637765-475a-4e40-bb72-89eea0d21bde" "0863d9c3-fb3d-49a2-bfda-03d754aae7f7"
 [346] "08640d3b-d9ab-4ac7-93e6-1bc64ba511c4" "0867d934-fd7c-49fc-bb13-367c526f335c" "0871e29c-72f9-459d-9b05-67c97bb36ce7"
 [349] "08735a14-a248-49ef-b682-18c43e195569" "087d2694-bfc9-4699-827b-0e6a337da429" "087ffe5c-0d1c-458f-8c9b-cf44fcb94f3d"
 [352] "088281ea-5d6c-40d8-9dfb-618a54e22eae" "0888bb69-21c6-4eac-a74f-3f279c696225" "08990aa6-dff4-4a5f-b209-b56c4de119f9"
 [355] "089f33b1-f269-450c-b5f2-fbb1fa6dfb6b" "089f8fd3-7f2d-49ac-9b72-a1da93185389" "089fd049-212a-4b2b-96bc-de9b715cd3c1"
 [358] "08a0d447-2f30-4650-bc82-96c57d78bbb6" "08a33b61-478a-46a4-9820-998b3a5f3e1f" "08a35696-1967-4b01-abeb-b610f305e0ab"
 [361] "08bcb2f2-ef73-4347-b5a0-98bc576d22ae" "08c0c26e-2438-4327-b06d-e5971b8d3b7d" "08c1d5f6-f2b0-4b9c-ac7d-1bd9a091da63"
 [364] "08d17d50-fad0-4789-b933-63d42567b8ac" "08d6d1a5-f5de-4b69-bc33-712d4c73cde0" "08d97781-4a9d-46ac-966b-d75c03ba2b5c"
 [367] "08d9ae07-5a1e-4636-8e27-0adb4bb04746" "08f3d85b-3819-41ec-af0d-e1302f1df22e" "09024627-f94f-4527-825a-07950aecd2fe"
 [370] "09025316-3427-47b7-9697-4753f4cfb3de" "090c5710-e0f5-4953-a903-298a683d6c2a" "09148d73-5d84-48a5-9fd6-4b16c19d090e"
 [373] "09165c6b-f79c-422f-850f-28ec51b4b222" "09286240-605d-44b7-a80f-47f18d660227" "092894ac-dd0a-4fba-842a-0ad6c1b9dc1b"
 [376] "092dabd1-7160-4230-b786-a8d78b8982ca" "093218b4-ddb9-4685-8abb-e4ba12976b55" "093843d5-3942-4f62-9164-350c4b4fdcfb"
 [379] "09463b71-5662-4706-aa41-1d1ae8fb5334" "0948bfaf-d6d4-4537-ae40-6cbfbf0cb594" "09525bc1-507a-447c-a730-77cc00909e3f"
 [382] "095894dd-411f-4ab3-bae6-b8117b404d30" "0959b427-b76a-4333-a719-aae180c1c45b" "0964871a-d331-439a-8562-3c2abd15b806"
 [385] "09673968-4f65-4349-a8da-e6efc0f4f575" "09683ed0-f75c-4071-b090-9f190e89772a" "0969b72c-51c7-43b1-ba0f-7c6ea6d1548b"
 [388] "096ed8a8-da39-42a0-aa63-f9c7637d94f4" "0970f1d7-8b49-4c12-86b4-1a784ba9b0fc" "09746ed7-59ad-42a6-b305-8e03ef416b6c"
 [391] "0977b700-1a72-4a4c-9a5a-b0680d0b3a65" "09784def-6f97-427e-b78c-0ee8cde83bfb" "0981cd32-8cd3-4f86-87bb-57baecb2ad93"
 [394] "0985dd80-9e73-4f70-a8a9-6f143c8c63a1" "0992991b-e14d-4da9-9401-c4bcf8eb68fa" "099610ad-523b-4090-b22d-70683f51d91a"
 [397] "09b18bd8-fd9c-41d6-b61b-54071eec9fda" "09b4310c-a779-4b00-b5ad-7c7c24eb8746" "09b6f72a-7dda-4241-9ea3-e2bddc779129"
 [400] "09c0dd36-abb2-435b-a74f-d204a82d4b7c" "09c8d0c3-2b43-4a5d-be4d-0a885e2eb571" "09cff4c5-69c4-4de4-b138-4d4e56bac1e1"
 [403] "09d14f2d-2d8b-4f0b-bbd2-b4b7cc87ea20" "09d2842e-44ab-4cce-93e1-9195584d1683" "09d49485-78a9-44ad-928f-f2532554813a"
 [406] "09da9e21-6b6c-4c1d-ae91-f95e8f57d3be" "09ef1623-404c-486f-8b1d-02e91620545c" "09f33d2d-fe60-475e-b163-18c541209f2c"
 [409] "09f7f89f-029d-453f-9b2f-91a1c88c8640" "09f8df75-f154-420d-b796-34b05bf30e3d" "0a0659e9-ea31-4bc2-bfc9-b54192c8858f"
 [412] "0a122264-79e9-4455-8741-187b07547823" "0a167f9d-3f5c-4815-bc65-4b456b0101fd" "0a269df5-afcf-423f-a961-b7694720305d"
 [415] "0a31d2e1-2e99-43f4-ba4e-3a923402c0e8" "0a3a2880-33ae-4d2a-896d-bbdc50bc8a48" "0a4a2e93-ee56-4dda-a635-b9c474dd4b11"
 [418] "0a5079a7-b9a3-4317-bba2-8199189af204" "0a67ff16-05f7-46dd-8ad0-57259dcb9807" "0a6c3b47-a97e-4748-b0da-273fc89a0190"
 [421] "0a7ef0a7-b918-4a85-b02d-d2452123af20" "0a83ef09-4718-49b1-b7b9-abc8b74d7e20" "0a92b965-5bca-4fd4-a5c1-8b05d6f39f13"
 [424] "0a9642ae-c10e-4778-a13a-c4205a7b3da7" "0a9751ed-0543-4754-8e6f-3936edae7321" "0aac1cba-0faa-4b51-ba58-99cb70b7f8fb"
 [427] "0aafd911-e0ff-4ef9-bb2a-800426898cff" "0ab20939-2ea6-42cf-996f-1195bc503cc5" "0ab257a6-5689-4066-8a62-78e4902c5572"
 [430] "0ab714c2-7661-4c51-84ba-ba11aba276ba" "0ac1c15c-0a25-4d9e-bff3-86e9a0f51e02" "0ac438ac-85a3-413f-9851-014b80f89512"
 [433] "0ac62e8f-45f7-45e0-92d9-d0f3a6dfc447" "0acb55af-a1b7-4bf6-b891-b3ffd9839c0b" "0adb75cd-81e5-42f4-bda4-c3c26f70308a"
 [436] "0ae546a7-a45f-4d9e-8778-78cbb6ac5ee5" "0ae5e3dd-704b-4132-b341-8ab14bd72a64" "0ae87438-129b-4b36-be6e-77199a4e9f6f"
 [439] "0ae9f6e7-0c85-4532-aa4a-47bdd0b11b99" "0afb7714-be95-4be6-b313-e818f6efa99f" "0b046ba3-a4fe-45ee-82fc-42bc96af5310"
 [442] "0b052433-1d0f-48e1-9516-e8310e7fb5ac" "0b05f6cd-45a1-4d10-85b3-11b8f61f7bd1" "0b151cc6-7833-4a27-be30-57ae8e643172"
 [445] "0b1ea6e3-65f8-478c-a0a6-29429e5164e6" "0b343b05-9f24-4ca6-95e6-d14c06ee9154" "0b4d097f-807d-40d6-a70f-3eebee07648b"
 [448] "0b59c210-b161-47e6-bb34-3ebe073d8215" "0b5e704f-63db-4e7d-87a2-c17a11cfcdb6" "0b67003d-ef4c-49fe-8fc8-c5d03a2a5cd6"
 [451] "0b7087c5-6dab-4f55-8193-b115caa64647" "0b722c15-5c4e-4d63-9e88-137a3a55b5d9" "0b86774b-a2e6-480b-afbc-fa5bf41d0975"
 [454] "0bac3398-1418-4233-8567-49ff29d8eaa8" "0bb8e083-f0d5-425c-a4ac-da7e6b47c814" "0bbb57ab-2fb9-4c97-978a-b8ad839d8f58"
 [457] "0bbc256a-af87-4f50-9cbc-d1d2275fe267" "0bcb9022-0177-4e79-8af7-4c90e1e2fbbd" "0bce52cf-9894-44a3-ac56-daec2c1440ad"
 [460] "0bced743-9d70-434f-9054-867431e0432e" "0bd49470-0b10-4ced-ab39-ae08f46d8779" "0be699d0-55d8-4c64-a04d-5dd218f16a09"
 [463] "0bf5575b-cfd3-4535-9007-b020d87e7446" "0bf8ff94-bc4e-4f2d-9bb8-09a7d89db51d" "0bfe42d1-3ecf-493b-90e4-dcefc886a3c8"
 [466] "0bffb140-0b8a-4028-9ae7-1b74d38d410f" "0c01254e-2677-408e-a84b-cc353da8ab7d" "0c0322d9-8a50-4995-adf9-50a997004d6f"
 [469] "0c075b6a-e326-4a70-8ce4-19ec75b570b5" "0c08e1f8-07d1-4a89-af15-639862d1b0bd" "0c1318a7-f6c0-495e-b40f-74b21651551a"
 [472] "0c197eed-a533-4e3c-8b9d-d29234aef643" "0c24f0d6-aed4-4634-9c78-a4c7b84886bb" "0c2778a1-7bc7-42ef-8a8f-9373fdb1a764"
 [475] "0c38521b-f179-4f1c-91be-50b0fdbf9972" "0c3cdd61-672e-4939-a9e6-0aa2e607eda0" "0c4108f2-fb03-4a01-ad0d-d6d382f7b847"
 [478] "0c43fca8-7157-4723-8df9-4405d29c6408" "0c47c4ca-b272-4e96-aae4-f23e08c241e7" "0c4ca454-1c76-4b12-b69b-dd84557e108c"
 [481] "0c4d3bb2-a9d2-4054-84e2-c4c4efadbc3e" "0c5007e9-3c33-401b-8ab9-a33a09e10c65" "0c5af47d-bd6e-4d08-a258-8eb76d367caa"
 [484] "0c5e6514-9b96-491f-8c61-8baef36b9e0d" "0c601719-95ad-41e1-a0a8-6f98fa7e43f4" "0c692309-98d8-44c9-a985-0a644f9c6437"
 [487] "0c6c3894-6784-48dd-a329-95307b30dfa3" "0c6fb077-1c20-4df0-8303-694b52060329" "0c7dcaf0-9145-4c27-8c53-c34a8a8af007"
 [490] "0c8e0b42-4f27-4ac5-b8d9-95bd1b311829" "0c8f110e-3649-445e-8435-a1f8beafb2b2" "0c938ea1-6468-46c4-86cf-507554389edc"
 [493] "0c945cee-6816-4514-8d6b-e65c92897c64" "0ca1b96b-81f9-4c4f-9931-f88395e59974" "0ca88c83-f47d-4c1b-bdfd-58e05b1cc5e8"
 [496] "0cb7ec21-90af-4bc0-924c-b11503b8d4e7" "0cc2af5e-fb0c-45db-b5e0-62dea311f60f" "0cc6dbba-9611-4f5e-9226-0300cc567106"
 [499] "0ccc679b-bd17-4db6-8e44-95d259a430dc" "0cccc61b-44b4-42a0-8672-b41a15ed4e32" "0cd78a57-703f-4d86-9abc-d06c48e71291"
 [502] "0cdd330a-12eb-4c6f-aa40-6dafb1d774b2" "0cde489e-137a-45a8-ba49-37f5c1f75889" "0ce19799-9e63-4c30-b49a-d6fc65e8783d"
 [505] "0ce8d2e9-ac9a-4c6e-a355-3d598b311f27" "0cf31268-b3cb-4244-8ea7-014783199899" "0cf41246-4963-4312-b2ce-f65172349c0d"
 [508] "0cfd335a-2253-47ba-b5cb-f6b21406b13f" "0cfd7199-6913-48db-95d1-ab2b6ebfb771" "0d08b615-e581-4f47-be4d-eb6d3db89b49"
 [511] "0d194045-0a8c-4dd3-b0dd-e3c8143dea14" "0d265382-0d3f-4f07-bdb1-5711066b25ee" "0d28c390-f5be-4543-8672-976ef0f6c295"
 [514] "0d2b0c03-5f8b-4951-b47e-b894d0ecde97" "0d3e08ff-235c-401c-8541-a69c6b747981" "0d49f8d1-5937-4c1f-8973-0dcb7a7e2927"
 [517] "0d4c58d3-c6bb-48f0-9736-64f0ea47a4f0" "0d4f848b-e61b-447d-b77f-6747b5d4bc5a" "0d5160b1-015a-456e-abc5-97d1a684854e"
 [520] "0d565c43-a569-4efc-b59a-e9713ce21b8f" "0d5f92fa-8fa8-42a5-834a-0d60e05a4151" "0d89967f-e741-4246-a8a3-04f1d9b1f6f3"
 [523] "0d911bb9-d262-4fac-b657-9db6378bfd53" "0d96b8e9-c40e-4253-940b-40e0efee491d" "0d9796c7-6bfc-433b-a783-d0842e67e50a"
 [526] "0d9aee02-175e-4006-89d8-5269bec1944e" "0daf0756-c746-4fb9-ba31-604de4ccdb81" "0dba76f6-aa8d-4894-99ab-e1bd24e5ebf2"
 [529] "0dbb2a57-b72c-4143-839b-0da5b2540457" "0dbbf13c-0639-4c95-a1b6-abdc9a61abcf" "0dbde8bd-03a7-4058-9a67-02e9e1ac36ce"
 [532] "0dcb59af-0123-4fb2-b921-7253ba88d7e7" "0ddf00f0-1b54-49c2-9b86-eeb36492b1d5" "0de1eb9f-4713-4428-9881-68fee042aeb3"
 [535] "0deb0b7a-a2f1-4c9c-9bdf-5bbd10c5554a" "0df5f83a-7634-4c34-a49d-025011890ba2" "0df812f8-66ad-46bd-b069-9544a5bc23dd"
 [538] "0df8f536-d061-41dc-9892-390e8c0719e9" "0dfcbaa1-f896-459a-8f7c-dab263a6b8e3" "0e0c8322-b9f0-455e-a077-85367b34b1a5"
 [541] "0e0f047f-c801-4287-8d64-341750f74520" "0e1ac1a8-f853-4f6b-a412-eda9f9662ca6" "0e1ec93f-beee-4e32-9ff2-3d87b2bfec39"
 [544] "0e23c1f4-c10b-4f2e-b2bb-0458e9f36f8b" "0e2cfd20-610c-427e-ba80-947dc1ccb8f7" "0e2d5c0b-1c02-4dba-831b-4e6a8e9737a8"
 [547] "0e376dc4-409c-423e-887f-3f599f5ddb57" "0e39a728-febe-40ba-bef1-16e5397877f9" "0e3b2d22-0ffb-4ddb-9da7-4b1cb2270deb"
 [550] "0e3cf2b3-6588-41fe-a68a-c04d23486371" "0e458b4c-eed5-401e-a6cf-6c539ff84209" "0e478408-59ed-4cc8-a69e-8b893c60fd72"
 [553] "0e54e957-46a5-4577-bd91-c89cff4a129d" "0e57d784-e918-4149-b070-52dd2035bea3" "0e5e4e61-f48d-4a4a-acab-26f3e1071756"
 [556] "0e5f3394-b269-4bb0-a231-0672d8904f39" "0e680383-b114-4f31-8b7c-9848bef5c029" "0e7bfc2e-ac04-4c6c-baef-88bbbef50acc"
 [559] "0e7febea-7eaf-4e1d-93aa-96b75a14db5f" "0e8014ff-405d-4f8c-836a-6e20321b4159" "0e945c3b-d1bc-4463-890a-4c3adb77eaef"
 [562] "0e954ca3-6d00-432a-a767-8de16f51c9c0" "0e9a2b9c-6133-4721-b3f0-f3c2c970c4f5" "0e9e5bf2-f0ac-490b-a0c6-df0d728c812c"
 [565] "0ea1a8f9-bf06-4ec5-97c0-8a558d3e0200" "0ea9b92e-9f3f-4285-8b89-98685a3f9867" "0eb61bce-80dc-4791-bdc0-f782ba8eb6bd"
 [568] "0ecfb53a-92f6-4ce6-832e-e912ea6d6e25" "0ed07388-5b72-489b-ba78-542b38a02624" "0ed07e14-7e3a-4aca-ab52-11f5c1b977e3"
 [571] "0ed2b2d7-a556-483b-8368-2dbab9e46b34" "0ed4981d-5ef1-4725-b789-a89f2ec17cdf" "0ed834c5-54e2-4bab-a3f1-9b7d44f8c5f6"
 [574] "0eeae795-79bb-41ef-ad0d-0cc23b1ed583" "0eeee618-4faa-4c73-8212-1d7d2dd00bcd" "0eefb206-4230-41f5-9e76-aa971b2a646a"
 [577] "0efd3dfb-9d1c-4b14-875c-965cfb98c5cf" "0f002bc7-19d9-423d-a320-ce4d296fbbec" "0f0535b9-db37-41f2-85e7-ba73bda41ccd"
 [580] "0f06781a-6c5a-4423-8293-c96392c7ce8e" "0f12f94f-558c-498a-bc9a-808f36f4013c" "0f1830fa-4d67-44c2-bf27-902db5b800d5"
 [583] "0f1a2c7c-85ce-4ae2-8e6f-0e73093ae48c" "0f200316-c4a3-473e-9b3c-ad621dc2c21c" "0f261f56-1c3c-49bb-852c-0e845a0dce97"
 [586] "0f28c610-7506-4319-908e-b581ffd911dc" "0f291bac-14d3-4045-803a-339b78181310" "0f297108-9db6-4653-ac23-32087cff7f51"
 [589] "0f2a8a7a-8d33-4201-9574-18ea0e46d770" "0f2eacd9-0404-4305-ac65-b60d4893659e" "0f399ebb-208d-4b8a-a22c-628f5fb65a55"
 [592] "0f39a065-6719-451f-bede-386356b0ad63" "0f3daa4d-5ba6-4f48-80c3-44cf33ca21b3" "0f44a829-3088-4ab4-8000-4ff63c492a42"
 [595] "0f55b639-8c96-4ee3-92ef-d739d07fc9a5" "0f58f828-9654-4cf8-942e-6e9bcce8ef5d" "0f5c0b17-84e2-4508-9dc0-6989edf662ea"
 [598] "0f60d038-0baf-4600-a73d-6d442f469666" "0f6629e8-af78-4af3-a48c-c4cf1043dc25" "0f6a4e96-d9be-45cb-b3c8-4745e597b065"
 [601] "0f6c4bb8-2c76-4eba-9553-796630bf9c93" "0f6c6493-4cfb-48f0-b900-0f325b8f5304" "0f7c3238-1617-4150-bb71-e8afd56945b1"
 [604] "0f83f301-7f73-4410-ab23-5da9522d9ddb" "0f927e31-021f-49d5-87d3-cb4f64feae10" "0f9beca3-6c07-4bd3-a421-d9e9be462ca3"
 [607] "0fa7b223-fbee-4623-8580-4d45b3b57197" "0fac163b-fea7-4cb2-8f79-a9dd658a25d3" "0faeef4f-02fd-43b4-ab42-25c7c58d969f"
 [610] "0fb53778-57c1-47c8-be11-77ab88509874" "0fb91d7f-ba7a-4b4f-9fd2-fb62c1df37c3" "0fc0f989-abf3-4899-8cb9-7f2a8e38397a"
 [613] "0fcd48b7-af24-428e-ba48-58aa8dec2e43" "0fd61762-f23e-4122-87ad-94514854a226" "0fe636f6-6a9d-4fbd-9cb7-db1f2f112558"
 [616] "0ff0a431-c7cc-4dc7-bb2e-2a32b0e7b736" "0ff5f35d-c2ee-4bfe-8db5-e139d9888017" "0ffd2520-36bf-43bb-b17e-bef86b8eb92c"
 [619] "0ffd684f-bd9e-4eef-9ad0-529ef9b4ac35" "1003c9d0-7105-4b38-9c10-31f3f73057ee" "1007de8e-1b0a-4242-b0c0-c9e6c76bb363"
 [622] "1007f19a-65d8-45b5-93f3-ab340c464d9e" "100d4f1d-ade6-41e5-bf23-353a4c1e6023" "1016ed79-96fc-4ccf-9972-88bb1556f081"
 [625] "101ea0b4-4111-483c-88c0-e2ef72b3acfb" "102459fa-9e3f-401f-93ca-817bd4c92623" "102502c1-0c42-4054-9810-9a2a336edf60"
 [628] "1027c667-f55f-4114-95db-4213860084b7" "10281faf-50ee-48d4-89e6-177fe6f723ab" "10293574-d2ff-46d3-b056-e9a52ddd465c"
 [631] "1039cecd-28ee-4266-9c59-f177ce6b98b2" "103f1ec2-f6d1-4385-8a38-ead64be7ea2f" "103fa5bc-1da9-4e9e-b857-2e25f4292b73"
 [634] "1042eb82-0b5c-4a25-8c0a-a955fc4b7c6c" "105db06f-e384-4eac-a148-41e7ad97f949" "1063732e-ee3e-40ec-a1f5-81958b7d2cea"
 [637] "106807b9-60ed-42de-88fa-a4881d351753" "106fb713-be6b-45c5-914a-ed961c43e578" "1070a667-3e57-4de1-a855-aeaaa66ed7cc"
 [640] "1070b9e1-0e93-49d2-be64-de907e09868b" "1074248e-f315-4c64-bf2f-9555ce2e5652" "1078b461-e385-4f87-b783-9dc814efaf37"
 [643] "107b6cfc-ec50-47a6-b07f-ab49626e386a" "1081127e-13a8-4ccd-9147-3cd602739912" "1084647a-30fa-42ef-b723-1b28a7452256"
 [646] "1093a1f7-8a36-45e7-8683-c24d20e3788c" "10986bd0-8327-4f7d-bbcf-63c78bea9626" "109f3985-0621-4866-b03d-415b9a1ef57c"
 [649] "10a061b6-40c6-4ede-a1a6-7e6d4cccfaad" "10ac0585-a570-449a-b1cc-1c5fdcf1ac2f" "10b0ddf2-5a2b-47c3-93c7-4709a19a50f8"
 [652] "10b5ebd3-576e-4fdf-9888-73543af6e6d8" "10bc6b8a-d28d-4ae7-8b3d-a62c6e4d20b7" "10bdfcf3-3ec0-4959-8791-8878a4cabf1a"
 [655] "10be6365-25aa-4f29-b28f-a1c5db94a35b" "10c1ea5c-c036-41f3-81dd-e1fe823bcf29" "10cabf38-9f43-4e4f-ad50-5aec5f599e98"
 [658] "10cb0503-017f-42e8-bf9a-601ceb946ca1" "10d24161-4d9d-4f2a-971d-6d6163bbc97c" "10d97045-c0c2-4810-937c-a395e9cbf461"
 [661] "10e1a965-cbc3-4669-94f0-ffea1f5e9842" "10e4d18a-ab8d-482f-8d98-b58522612d79" "10eb58bc-02bf-445c-8ff8-e967c885a322"
 [664] "10ee8639-c505-461a-8bee-bc79e70baebd" "10efd5ed-55b4-418d-8593-1d9b04e164a2" "10f3f047-5249-4530-9ed8-26e414155e3b"
 [667] "10f93c7e-d929-464a-8efb-32849e8d20ce" "10fa7c66-b5bf-4172-ba95-46ca31d8853d" "10fc0cc2-b64c-4840-887b-b6776e6ddc10"
 [670] "11073e24-bdc4-4652-8ec9-432de7ae9ae5" "110f3cc2-9f3f-4901-8db3-b06d2e241a18" "110fae08-2b7e-4354-b5fa-19cda7fb61ad"
 [673] "11135d13-db03-4db0-9a15-4e0af57f085e" "1115a6be-b21f-44b1-91d8-f6aad58fc420" "111c7571-63a8-4e01-ad91-71ba498cf876"
 [676] "112432ee-dacd-422f-a6d6-69a5b18bbb30" "11273e23-e0dc-4ca3-a246-40fb12b17861" "112cb521-52ba-4fcf-a145-f7099e10ed32"
 [679] "11347c56-175f-474f-b03c-4b7d7741b9ba" "113d4cb0-b592-4a93-8cc4-c765e0b1a4c2" "11539390-5dd9-4784-b990-cba44e7dc6ed"
 [682] "11545a3a-c4a7-45a8-afbb-3e7da904757c" "1162f1fc-3dc5-4c3a-955a-ad65fd6ad7b9" "1163f21e-93bc-47bb-b66e-2cbf48ada709"
 [685] "11648678-acd0-48f7-82e3-622ce0386147" "116f3909-6747-499c-acd9-8b141444064c" "11872d67-7f36-419b-9b62-576ac4505dad"
 [688] "11884eac-f9ae-476f-b110-e3e16ba9ba6b" "118b8e56-41c7-4f6f-9769-88748b0aad1c" "118f5de7-7d74-4aa4-809e-7e2c13fd4d71"
 [691] "119a1a25-a856-428c-8803-a6241a265016" "119e619e-0b26-474b-922f-0f44ab19ceae" "11a905f5-0380-493d-a6e5-932fee3b8695"
 [694] "11c19924-def1-4428-a8e2-dacbe919f3ce" "11c2cdd6-0018-4288-990c-4a21d69806e3" "11c4760b-441a-49cf-9b2c-0b2ba1e4be6f"
 [697] "11c555c3-4ffd-4e35-bbb9-3b4bd757080d" "11c57c10-b32f-4d72-8a08-76889ba44d58" "11c87518-959f-4125-9641-e83ff82948d8"
 [700] "11ca5164-97dc-4601-bf7a-f7d84b6f9e21" "11cfe023-ee07-4730-b19a-1087983d121e" "11d11e96-42d2-498d-a980-986f7222c3b0"
 [703] "11d6e21b-a171-4aa6-b24c-54176bd9eb40" "11d82ebc-f07b-409b-84bf-89cb71c15a2f" "11d9fec3-03e0-4119-a740-fe082ebe1d81"
 [706] "11e3b2fb-856e-40d9-9248-4d5957c9f61c" "11e3b828-12bf-4fea-a00a-cb3ab1b7baa9" "11f57f28-d481-42b8-ad41-7d92ec5243a9"
 [709] "11fd5ce6-3eeb-4fe2-a214-8a4011006202" "1208af7b-c88c-44ff-8f36-979b8761b7be" "120ef303-f82a-43e4-aa50-d5234b4f7618"
 [712] "12130941-47c7-438b-badc-897e3188815c" "12186385-44b4-4c3f-90b1-ff87ef3b79c8" "121b5198-7f44-428d-a508-1915dd97384f"
 [715] "12207f19-201b-4e17-9367-e9b9de0471d5" "1220d8a3-c461-443c-a450-72ca0f32f493" "122656d1-4b0c-49dd-87ee-8c9f0e8e6f0c"
 [718] "123ab042-f1bc-45aa-8acb-a12890a322a8" "123da971-3bba-45f8-a6d8-b8504fc0a304" "12457220-3b9f-4fa1-bb80-28b1121df29a"
 [721] "12479d14-bfb4-4a79-8d10-3cb02802c952" "125cf4a6-2d9c-424a-98f6-dda179589293" "125de345-2b60-4c6f-bf41-f54f978efbfe"
 [724] "12739cae-1ba4-41e2-becc-991a8db3d110" "127d3211-4b8f-4142-a75a-13f67eb1b0bc" "1281888b-33ec-4cb2-abeb-b416890c3434"
 [727] "1283227c-a0e5-444a-8456-1a87fb917c71" "128d61b6-ae94-434c-bba1-efe996d0da9e" "128fb2cf-b8a9-4bc2-85af-569e4b6b261b"
 [730] "1298831a-f5ce-40a4-b15a-faea2b7545c6" "129985df-b47f-48bb-9749-ec55d9996fa9" "129ad8e2-4565-43d6-8536-fe2015dbce62"
 [733] "129e620e-52ee-4b82-a1f3-9d7c34a7b668" "12a0dab0-f036-4c1e-af02-d0a61c359b64" "12a33025-80e5-44c1-9542-00b4392d1635"
 [736] "12a3d51f-6e73-4000-bc9d-824cb3feda4a" "12a41547-8a9b-453d-90e5-8cc1aee6f1ef" "12a93d0e-ac43-44d8-9a0a-0b2470015caf"
 [739] "12ab1045-b4b0-4f91-8569-c14980c64e49" "12ab7e4e-5bb7-4812-976d-bcd66064add8" "12afbc39-c175-4baa-b74e-c1d55aadde82"
 [742] "12b4469c-9133-4386-a63b-3b9c7429bcd6" "12bcb777-6ab9-4aed-aea6-f201a9216545" "12c0c393-5b80-47ae-ba23-ac0d0737b592"
 [745] "12c3ba80-ea4a-44e9-8661-599e81a766ad" "12d74c28-29df-49cc-b80b-92744d34d11d" "12dfc642-cfef-45bc-a620-22cfd150c7a7"
 [748] "12e191ca-1124-45f8-993d-c871f1a652de" "12e60f25-2be6-4022-b312-e40af813e80d" "12e6180e-ec51-42d3-b8f4-3247b70088ea"
 [751] "12f72030-dcd2-4391-9dbb-d6f450d832da" "130040eb-c999-40b7-a343-5f52b3db2b36" "1301f208-acbc-4bb2-81d8-9dd0fa917a14"
 [754] "13038db0-94b0-46f2-a7da-7bb4915dbd50" "130cc0d5-576e-4316-bbb3-12c26c692de9" "130d559d-4a5a-4df2-918c-3b5ddf71ab17"
 [757] "131905d3-6ff2-4b34-b4d8-5edd45ba485b" "1327c9dc-b897-43dc-a62d-89942a7fc78d" "13292f18-8f44-4f4c-adeb-04d0b67012b9"
 [760] "132cf265-dfad-4a02-b792-739d7f3d05b8" "13346d7a-a363-408e-b743-9dd02c58c1fa" "133fc6df-103e-4118-a4f8-668aaa6bc72c"
 [763] "134c898c-92b7-46ad-9ed8-14c5fab2b192" "1353313b-a6b0-4975-bbeb-8a8bb2f44b39" "13547dbf-2665-49e8-8579-4973a1b2586c"
 [766] "13740c2d-ef6b-4888-8bb0-707d9d21f0f5" "13745cc1-cb2b-4117-ba85-90468fa23d46" "137491bc-237e-48e0-9b3f-16b0fa3b5482"
 [769] "1378b8b4-c291-4b85-8276-1ac66d03f57b" "1379f28d-a396-437d-a9ab-d1715d7c8cbe" "138562ae-014b-434d-85bb-4a25b42869d8"
 [772] "1395b7e1-7780-41ff-ba7f-1655ddf329fc" "139b8d49-1769-4f36-84a3-69b9ba7dbd33" "13a0f8ba-3e89-41bf-8bda-7fbd80a5dab3"
 [775] "13a41772-b1fe-4a82-a00d-6882e63c9939" "13a657d8-6035-4152-936f-ced526e849fc" "13af49a7-11b6-4fdd-be0a-e0d9d7d6f4f7"
 [778] "13b76b42-71a7-4137-ba16-47123dae0e38" "13ba3cb8-940d-4beb-83a1-58bac6e56495" "13bdcdd2-5464-4cb5-b1af-d7c8275f84ec"
 [781] "13bf219a-5f60-4d76-a3ff-c939da32eff5" "13cdc437-3c06-40c0-a210-a0b2f7e3ea8d" "13ce9de7-afe8-4d9d-9c11-d8f50a5b8903"
 [784] "13db0e5e-f299-4ebf-a994-a7534b6da298" "13dc4443-f38e-4ea8-92bd-5c4c601d0855" "13de73b2-e55d-4cad-9637-01426da92c6f"
 [787] "13f3f9e5-e4c3-4de7-b424-71e226c1d8b6" "13f4fd44-ba25-4ae6-924c-daf5e4ca6671" "13f972b9-85df-48dc-9bd3-91b2a2e8b170"
 [790] "13fe0264-e1c3-4612-9720-e6cc568939e2" "13ff73b1-3925-4fd0-9c44-733b912d7e59" "1405b881-d3c3-49ad-9fb8-a4f42946ca01"
 [793] "140ba32b-236b-4394-9ab6-c17f69785670" "140c9f5d-f195-41a3-b133-804b5af900cc" "1418acfc-f54c-4751-929f-747c0199c780"
 [796] "141c3ba1-e952-4d27-b474-16beb85ee6ce" "141d307a-0fed-4c8b-8f95-3a9bf9289bc7" "141ee0c4-f5f1-419b-b7ad-a384148bbf0a"
 [799] "141f0590-2ad9-4603-8742-190dd56437ee" "142e5907-f3d1-413c-94ab-1f27ad439cea" "142ec00d-7c95-4295-ade6-102d5b9bccfb"
 [802] "142fcfd1-8a96-4bf5-a46c-20443940f473" "14394348-8de2-48ad-b90a-646c5380b4a2" "143cc16b-92aa-47cc-b242-edb25c6e3184"
 [805] "1440f33e-c776-4627-b8cd-8d9794fadb23" "144f39f5-5395-4b3a-bff3-702e8ec7107c" "144f409f-a646-43ed-a273-fbac2e2e2569"
 [808] "14511bc7-7a5e-4ab9-902a-f524f05516ab" "14515eb5-5998-47df-a383-abcc54b7e820" "1456d18c-4f60-402a-8a1f-ee933a052980"
 [811] "14631e50-3bb0-4f48-b367-85caf3b6f4f2" "146756b2-847d-4a1f-9a5f-924e3464ab57" "146cd182-d672-4468-9561-3939ae43a8ea"
 [814] "1470c123-7bf6-4d24-8cc6-151d8488a953" "1482e1a4-506d-4719-b0c5-8c33c4551199" "148393ea-953e-457b-ac3f-2a8760b84050"
 [817] "1484e8f1-308c-42e2-badf-b1d2b91c6abf" "14887f81-deb2-414b-945d-675d791d9554" "14984046-47bf-4c79-a248-873e632de805"
 [820] "14a9e8c1-aac9-433f-86f6-c496accfe261" "14ba7798-3294-4efa-ae56-b5a06e0af8bb" "14c3acfd-49b8-482c-98ec-325722bacb9b"
 [823] "14c5e3ff-2bfb-419f-bddc-1f04bf9ae956" "14ca2c81-bc87-44e2-8899-2ee3028cea60" "14cbc23c-a597-4634-8636-12874b701303"
 [826] "14d6abda-0a44-4c8c-9a28-ca151d614f32" "14db68f0-bd27-4c73-9c58-4a7a42e35c42" "14dd9582-4ca4-4ecb-9325-a3cf3758d36d"
 [829] "14e11376-be28-429a-8ac9-03879751807e" "14f67955-a0ea-429a-b09e-5d3a7d51e640" "14f7f3e3-ffc4-4d5a-8287-d7a7a2565256"
 [832] "1502d065-bc92-4f13-ba7b-a8b5628c68d6" "15085449-74b7-4825-991f-74d649e0e25e" "150adb45-b014-4eec-9139-870bd1e68f81"
 [835] "1510188b-bf19-4ca4-94a4-30b20b631b31" "15102295-243a-4642-8e06-9424018536c9" "15108c33-0fa6-48ed-a81b-b48e82d41b4f"
 [838] "1511564a-cf4e-406a-8dba-4be25486a28a" "1518c47b-d1aa-446b-b8b6-3727a81acfa4" "15197eed-78e0-4240-8743-cc01e46d7fe4"
 [841] "1522bb99-85a8-40e5-9e51-0221ae11f742" "15252dc5-d7a4-4e86-9ff7-21ab23616c83" "15278d84-831c-43db-a28b-68ab937e5cf8"
 [844] "1536335e-8b6f-463e-80e7-747f4502d5ed" "15363d88-9e3a-419d-89b8-6753898cd0a9" "1538f2af-5196-4066-92ed-040fb2384a36"
 [847] "153e1493-2b80-4473-b2b5-6a6523aca598" "15404f39-6143-475b-b6d2-9b64774afd3f" "1543096a-7daf-4f63-97a3-86008d22912a"
 [850] "154b7634-4a25-4030-a34d-b9d3c2a2b2ad" "154c87ab-dec1-48b7-86b5-fa2b346c371e" "15519da5-4e0f-4abb-b8fc-69c748c70491"
 [853] "1553ae84-d27d-4c69-bb88-3161a17c626b" "1558573e-609a-4991-a552-727534ca83a0" "155dd040-f4bd-4f32-b956-176b2c3d851b"
 [856] "15613b18-bad6-4158-ac83-a70a38d6653a" "1564f243-c2b5-43a8-9f64-26136cae438a" "156b8a22-de99-4091-a4e3-6af5ad953686"
 [859] "156c5367-653c-4754-9cc3-bcb0ae07fea1" "1570ea7f-e8e4-4ead-b533-7a49cf7f0433" "15759ff9-eea4-4c95-8adc-2486c8d7731e"
 [862] "15795d4f-a2ef-4ecd-9821-1c9458e97f33" "15863198-d6f9-4494-8a77-4116555dd3fb" "158c4dcf-4ba8-4b7f-8d0e-b605a3c6a46d"
 [865] "1594e5a9-c025-4ecf-b37b-2927753f9b18" "15958359-ccb6-4987-bec4-adf6d1a3a47a" "15977d2d-d621-4258-98aa-4d29149371fb"
 [868] "159beab7-2478-4e79-96ae-e9c1cd2d8e65" "159fa50b-7ba9-48d9-9bca-038fb47737b5" "15a2ad75-e284-4ee1-8866-1b50a278b3a9"
 [871] "15a9c17f-95f5-4326-9435-655fe877e1ee" "15aee68f-31c8-4ff0-807c-c7dc61e8384b" "15ba27f0-e13d-4417-9a91-608cb03d9fda"
 [874] "15ba6863-54b3-4dd0-a94d-590a7bd893c1" "15cad456-f45d-422c-876c-143a22682e64" "15d21224-f0b2-45d5-987a-0fefa898be6b"
 [877] "15df3ac4-b56b-491f-ba02-f9edfd435ed5" "15e379ea-0db3-45ce-aec6-50916b902795" "15e59432-9239-404a-8023-50097e7cf1fd"
 [880] "15e5b579-dfdd-4347-9abe-3fc282647d13" "15ef988c-bb4a-4c9a-9351-19e097583294" "15f504bb-951a-4e52-ac27-56bdc2debba9"
 [883] "15fc226a-0dd2-4c71-89a8-8d59a462767c" "15fd4bd7-0a30-4d62-91d8-f0685c056433" "15ff2e2a-0d7e-4288-b391-ecff8d1e077b"
 [886] "1603aa40-92bb-4971-b722-d8d57e671df2" "1604fe1d-b91e-43ba-b002-f25e117f10ec" "1606186f-74b4-4f8f-8d83-6757f308e5c2"
 [889] "160a17cd-ee62-4ede-a567-3b041b19fb9f" "160a2519-8b90-4fdc-b389-10355f99178a" "16151a85-f127-48b2-ab5e-2f8206866341"
 [892] "1618df93-3d37-4b6e-bee2-d50411eb7d7b" "161b9fbc-0ffd-49dc-a67a-75766e1336b2" "161d59fb-9009-4642-9edf-f9ac3795308c"
 [895] "163720a3-fc2a-4970-8921-0ef2eb4947e8" "1659267f-adb4-44e3-be08-244cf3e45153" "166357f3-4900-4de5-bcc9-a9e09ad08928"
 [898] "1664f055-6b1a-4129-9735-0313081747f1" "1665412b-71bd-4377-8342-bb4c8b1eb9c6" "16667616-3a27-4ac2-87e5-6fbac1b6eba4"
 [901] "1667fd88-2388-4297-923f-babb11c534d4" "166a4dac-a03c-4e81-923b-118d3b438388" "166ae059-e0ad-40cc-8269-d60f50660fef"
 [904] "166fa527-ec2e-41c5-bdeb-cc9ee0133f5a" "1670efa2-3ea6-45a3-a37d-f54ee386c299" "16815cb4-7e3f-4d0a-9764-d4fdab8b9cf1"
 [907] "1684eecf-b82b-49a8-8e65-50bb18c7c092" "16936d6e-a06d-494a-9ed4-5470bd4f7bd8" "16970cb8-be02-4c3b-91fb-abb1087659d6"
 [910] "169b0486-ded7-444f-a5f2-4051b31bdc80" "16b88af1-d551-4c1b-b179-ccc0baadfcd2" "16b899cd-511a-49c6-8f59-7134cfd4b776"
 [913] "16be2037-4575-43a1-a49f-93a4f7a2b2d5" "16bee399-508d-4b2d-a834-afe325c7fb6f" "16c64bba-6681-41ab-a7eb-2111be4c81fe"
 [916] "16cc3b2c-d8a4-4749-b548-3c44b7993413" "16d7a72f-d357-472f-8c93-f29adbb10c91" "16d7df59-7fde-4bf8-bb96-3693735e6d8e"
 [919] "16dc208f-9b49-4870-a3b9-a0e71d445099" "16deb2df-fe4d-484f-a8ef-6eb4a9fabe9d" "16e887b5-069e-4acd-9fee-7e2736fe10a8"
 [922] "16ee1517-2e30-49a3-a161-2c4787f0d829" "16f0ecae-eb5b-4e4f-9f27-4d387535f935" "16f75c70-c55a-4d4f-9eaf-b32b10296cfd"
 [925] "16f89107-f5a3-4492-9d3a-bcaa3a7b5cb7" "16f928ce-0595-46f2-86db-9cbd203df9e1" "16fd37e2-c563-46ac-bcc5-995587079611"
 [928] "17020410-ea50-4966-acd3-861d2b8e09c4" "17090fb9-4b74-440f-82e9-e4371d831f6f" "170b75a1-660b-45b3-ba10-0a0487c77448"
 [931] "170d6c85-e8a5-497a-9d7b-840a2da0b954" "1716e21f-a7a2-4e4d-a508-12ddfc9ffa9b" "1717cb31-2cbe-4209-a04e-18b2e39545d4"
 [934] "171f8188-1a4b-463d-9f50-537c5ba0e15f" "1720b66c-1503-4655-bba6-da3a7716b3eb" "17238b63-82b8-401d-a699-5ea832e851d2"
 [937] "172f58f5-eaf3-49de-ad75-866295b89f3e" "17314826-4265-4610-ae4b-3e6d3ecfed5b" "173dcb62-cd4c-4001-8ce4-062b89f382b5"
 [940] "17404fc2-d012-4eea-8788-3ea2991cf7fa" "174150a2-21da-4847-9ea1-ed0e79a2dbcd" "1759d779-e751-49c6-96c0-925fc4829a76"
 [943] "176216f8-21f0-44d1-93b6-44ae815f577a" "17631dae-280e-4634-8036-d1cf810af0fe" "176c1efb-1e1a-42bf-a3c9-695d66898db3"
 [946] "17768e86-a5d7-4125-8a65-4cf5adf062fa" "1776b8c5-abb6-4190-987e-25d314d21469" "179c301c-1626-44d7-ad0f-c7ee31d0a70b"
 [949] "17a04e5f-60e2-4948-9b2e-cfc4914f0f3b" "17a78e4c-dd6e-4397-891a-0e1d702fcebe" "17b21ae1-61ce-4821-a2c7-2ab9dba13b4e"
 [952] "17b355e5-6fd4-434f-b33b-05c65504889e" "17b47aa9-5331-40b5-b017-257ace88592b" "17bf7c62-934b-4749-ba71-c0b7967a6852"
 [955] "17c13022-5a88-461c-882a-5d793b296346" "17c6ed9d-c6a5-4947-a737-8409a5017d38" "17cdc061-2606-41aa-adc8-dc684dd042b4"
 [958] "17d2e152-8347-4ff1-8e69-c66a98ead8f3" "17d5db81-9ccf-4b3e-a256-81174284df95" "17eb22db-08ab-4c86-9f3e-35f05bf6704a"
 [961] "17ec839f-130d-4949-9912-25d94baa4bb2" "17f06a2d-125b-4b0d-9fde-07f650c07f8a" "17f3814d-3cd6-4e5c-b35d-550fad4c70b0"
 [964] "17f6139a-9094-4c6a-871c-dea08083ec10" "1800ba6a-e9fd-4ea8-a29f-f475a47987ee" "1807e083-d82e-409c-8d83-9b1d261a2844"
 [967] "181044a2-8575-4068-898d-277c6f054d52" "1811d136-f50b-42a9-8934-dbf24ec44180" "182054a8-9590-481b-8fd4-439575830bef"
 [970] "1824284e-386f-4945-9313-0c556e0c878a" "1836ca4c-b71c-4d2c-a8e6-2532836e3578" "1837536d-8464-499b-9f7a-1f7811c0461c"
 [973] "183b4599-91c6-46b6-9459-635b7b144892" "18443bf6-2099-43ef-a99d-21aedc614145" "18596e01-3794-47ed-8f97-6f9512c9c847"
 [976] "1862034d-317d-4e5b-80a4-638ae9a35dfb" "18668a50-1659-405b-b27d-6592a8f16de9" "1870a588-302b-4fee-883b-2e5e76046635"
 [979] "187a26f1-1716-4e43-b0e7-95b5d1ac7bab" "187b1a8e-8e6e-4be4-8c0d-37ae4f85e181" "1881a811-04b7-4917-bacc-1515fe565862"
 [982] "1887b19d-f4d5-40c7-a227-d94f68e6ed1a" "1889be57-4ba2-47e0-9ea2-81c0a435b286" "189478e3-a844-4fab-b308-db8eedc8250a"
 [985] "189ce06a-64f4-4ee2-b633-e09309b51aea" "18a08016-dbfd-492c-90bd-e5f9635e5fd6" "18a1845f-9ecc-4c4c-8420-b08873b5d409"
 [988] "18a7ac76-8235-4d3f-9d7e-963df1a23f06" "18ab58d5-c549-41ee-a502-7d97e417edc3" "18b067af-b255-426b-b54b-91e96198e52f"
 [991] "18b94a9a-3492-4261-a3a8-3d1c76670c2c" "18bdd271-4238-485e-9e24-fdbfa3750e7a" "18c28c4a-b609-483b-9f38-4353b33c2d9c"
 [994] "18c6cf9a-d3c5-4820-a3d7-1e98b724985b" "18c7005d-180d-47b4-bfaa-c4ba83195895" "18c867cf-c73a-40b6-9c51-8bc4e5faa631"
 [997] "18d50f31-e28f-4b40-a4a9-559faaccd16d" "18d65695-b56b-426a-afab-bc595b6ff53e" "18dad6ec-c59e-4840-93c7-8bca0f67f420"
[1000] "18dd1b96-0847-4482-990b-445a461265ea"
 [ reached getOption("max.print") -- omitted 9588 entries ]
class(log_data)
[1] "data.frame"

As we can easily see, the RAIN options and the HHI option dominate the choices from the top Menu. So, we decided to dive deeper into each of these menus to see if there are any outlier selections that are deep within the system. Additionally, ths distribution across languages seems to be fairly consistent at face value. We can run tests in the future, but for EDA this will be adequate. For 3/4 langauge options - having more data would be apprecaited

RAIN MENU

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –> TOP MENU –> RAIN MENU

Here, we look at the breakdown of individuals who have selected a given option in the rain menu at least once. In the data, MAIN MENU == RAIN MENU.

RAIN MENU

  • PRE PLANTING OPTION
  • PLANTING OPTION
  • CROP PROTECTION OPTION
  • FERTILIZGER SIDE DREESSING
  • POST HARVEST AND PROCESSING
  • REPEAT RAIN MENU
  • RETURN TO TOP MENU
  • INVALID KEY PRESSED (ADDITIONAL OUTCOME)

We can see that the pre-planting menu, which still has over 75% of unique users accesss it at least once expereinces incredibly high usage. So, we now dive into this menu. We will breakdown conent selection by language and overall

RAIN MENU/PRE PLANTING MENU

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PRE PLANTING MENU

Please note, the pre planting menu under the rain menu is referred to as MENU 1 in the data

PRE PLANTING MENU

  • LAND PREPARATION
  • SEED VARIETY
  • REPEAT MENU
  • GO TO MAIN MENU (RAIN MENU)
  • INVALID KEY (ADDITIONAL OUTCOME)


#filtering out MENU 1 options as the pre planting
MENU_1 <- filter(log_data, grepl("MENU 1",logInfo))
MENU_1 <- filter(MENU_1, !grepl("HHIMENU 1",logInfo))
MENU_1 <- filter(MENU_1, !grepl("APICULTURE MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("APICULTURE SUB4 MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("DAIRY MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("SMALL-SCALE SUB5 MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("DAIRY SUB2 MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("FATTENING MANU",logInfo))

MENU_1 <- filter(MENU_1, !grepl("FATTENING SUB1 MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("FATTENING SUB2 MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("HOUSEHOLD MENU",logInfo))
MENU_1 <- filter(MENU_1, !grepl("HOUSEHOLD SUB1 MENU ",logInfo))


MENU_1 <- MENU_1 %>%
  group_by(callerId, logInfo, langId) %>%
  count()

MENU_1$logInfo<- str_replace(MENU_1$logInfo, "MENU 1 - ", "")
MENU_1$logInfo<- str_replace(MENU_1$logInfo, " PRESSED", "")
MENU_1$logInfo<- str_replace(MENU_1$logInfo, " SELECTED", "")

# plotting
ggplot(data=MENU_1, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 25, hjust= 1))+
  geom_bar(fill='cyan')+
  labs(
    title = 'Individuals By Content Selected at least Once from 
    RAIN MENU/PRE PLANTING OPTION',
    x = 'Content Selected',
    y= 'count'
  )

NA
NA
NA

RAIN MENU/PRE PLANTING MENU/LAND PREPARATION

We continue our pattern of following the most accessed submenu from the previous subment - land preparation! This is also the bottom of a tree. We will breakdown conent selection by language and overall

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PRE PLANTING MENU –> LAND PREPARATION

LAND PREPARATION

  • BARLEY
  • MAIZE
  • SORGHUM
  • TEF
  • WHEAT
  • SESAME
  • FAVA BEAN
  • CHICKPEA
  • COMMON BEAN
  • COTTON

ORDER UNKOWN:

  • RICE
  • DURAME WHEAT
  • LENTIL
  • MALT BARLEY
#GETTING THE CROP MENU FROM MENU 1 (rain/preplanting/land preparation sub menu)
land_prep <- filter(log_data, grepl("CONTENT PLAYED - LAND PREPARATION - ",logInfo))

land_prep_final <- land_prep %>%
  group_by(callerId, logInfo, langId) %>%
  count()

land_prep_final$logInfo<- str_replace(land_prep_final$logInfo, "CONTENT PLAYED - LAND PREPARATION -", "")

ggplot(data=land_prep_final, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 45, hjust=2))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
    content actually played by language',
    x = 'Content Played',
    y= 'count'
  )



#get rid of the language breakdown
land_prep_no_lang <- land_prep_final

land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- AMHARIC", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- OROMIFFA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- TIGRIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYITTA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYTIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- SIDAMIGNA", "")

ggplot(land_prep_no_lang, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
    content played overall',
    x = 'Content Played',
    y= 'count'
  )


ggplot(land_prep_no_lang, aes(langId, fill = logInfo)) +
  geom_bar()+
  labs(
    title = 'ALTERNATIVE RAIN MENU/PRE PLANTING/LAND PREPARATION
    content actually played by language
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
    ',
    x = 'Language'
  )

BIG TAKEAWAY: 35% of users end up accessing the maize menu at some point! Wheat, Tef, Sorghum, and Barley also appear to be qualitatively significant

There is no menu to go deeper in, so let’s go back up a level and check to see if other branches have a lot of access

RAIN MENU/PRE PLANTING MENU/SEED VARIETY

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PRE PLANTING MENU –> SEED VARIETY

SEED VARIETY

  • BARLEY
  • MAIZE
  • SORGHUM
  • TEF
  • WHEAT
  • SESAME
  • FAVA BEAN
  • CHICKPEA
  • COMMON BEAN
#GETTING THE CROP MENU FROM MENU 1 (rain/preplanting/seed variety sub menu)
seed_variety <- filter(log_data, grepl("CONTENT PLAYED - SEED VARITY",logInfo))

seed_variety_final <- seed_variety %>%
  group_by(callerId, logInfo, langId) %>%
  count()

seed_variety_final$logInfo<- str_replace(seed_variety_final$logInfo, "CONTENT PLAYED - SEED VARITY - ", "")

ggplot(data=seed_variety_final, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 45, hjust=1))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PRE PLANTING/SEED VARIETY
    content actually played by language',
    x = 'Content Selected',
    y= 'count'
  )



#get rid of the language breakdown
seed_variety_no_lang <- seed_variety_final

seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- AMHARIC", "")
seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- OROMIFFA", "")
seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- TIGRIGNA", "")
seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- WOLAYITTA", "")
seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- WOLAYTIGNA", "")
seed_variety_no_lang$logInfo<- str_replace(seed_variety_no_lang$logInfo, "- SIDAMIGNA", "")

#alternative with langauge view
ggplot(seed_variety_no_lang, aes(langId, fill = logInfo)) +
  geom_bar()+
  labs(
    title = 'ALTERNATIVE RAIN MENU/PRE PLANTING/SEE VARIETY
    content actually played by language
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
    ',
    x = 'Language'
  )


#no language - overall
ggplot(seed_variety_no_lang, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 30, hjust=1))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PRE PLANTING/seed variety
    content actually played',
    x = 'Content Selected',
    y= 'count'
  )

NA
NA

We have mostly exhausted the pre-planting option menu, and if we go back up to the original rain menu (aka MAIN MENU), we can see that planting also has a large porportion of users - over half

RAIN MENU/PLANTING MENU

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PLANTING MENU

The planting option as a subsection of the rain option is known as MENU 2 in the data

PLANTING MENU

  • SEED RATE
  • SOIL DEPTH PLANTING
  • TRANSPLANTING
  • MOISTURE CONSERVATION
  • FERTILIZER APPLICATION
  • REPLAY MENY
  • RETURN TO RAIN MENY
  • INVALID KEY (ADDITIONAL OUTCOME)
#PLANTING OPTION - second most accessed MENU 2
MENU_2 <- filter(log_data, grepl("MENU 2",logInfo))
MENU_2 <- filter(MENU_2, !grepl("HHIMENU 2",logInfo))
MENU_2 <- filter(MENU_2, !grepl("APICULTURE MENU",logInfo))
MENU_2 <- filter(MENU_2, !grepl("APICULTURE SUB2 MENU",logInfo))
MENU_2 <- filter(MENU_2, !grepl("DAIRY MENU",logInfo))
MENU_2 <- filter(MENU_2, !grepl("FATTENING MANU",logInfo))

MENU_2 <- MENU_2 %>%
  group_by(callerId, logInfo, langId) %>%
  count()

#cleaning
MENU_2$logInfo<- str_replace(MENU_2$logInfo, "MENU 2 - ", "")
MENU_2$logInfo<- str_replace(MENU_2$logInfo, " SELECTED", "")
MENU_2$logInfo<- str_replace(MENU_2$logInfo, " PRESSED", "")
MENU_2$logInfo<- str_replace(MENU_2$logInfo, " OPTION", "")


#plotting
ggplot(data=MENU_2, aes(x=fct_infreq(logInfo))) +
  theme(axis.text.x = element_text(angle = 45, hjust=1))+
  geom_bar(fill='olivedrab')+
  labs(
    title = 'Individuals By Content Selected at least Once from 
    RAIN MENU/PLANTING OPTION',
    x = 'Content Selected',
    y= 'count'
  )

As per usual, we will go into the most common selection: seed rate!

RAIN MENU/PLANTING MENU/SEED RATE

INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PLANTING MENU –> SEED RATE

SEED RATE

  • BARLEY
  • MAIZE
  • SORGHUM
  • TEF
  • WHEAT
  • SESAME
  • FAVA BEAN
  • CHICKPEA
  • COMMON BEAN
  • COTTON

ORDER UNKOWN:

  • RICE
  • DURAME WHEAT
  • LENTIL
  • MALT BARLEY
seed_rate <- filter(log_data, grepl("CONTENT PLAYED - SEED RATE",logInfo))

seed_rate_final <- seed_rate %>%
  group_by(callerId, logInfo, langId) %>%
  count()

seed_rate_final$logInfo<- str_replace(seed_rate_final$logInfo, "CONTENT PLAYED - SEED RATE -", "")

ggplot(data=seed_rate_final, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 45,hjust=1))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PLANTING/SEED RATE
    content actually played by language',
    x = 'Content Selected',
    y= 'count'
  )


#get rid of the language breakdown
seed_rate_no_lang <- seed_rate_final

seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- AMHARIC", "")
seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- OROMIFFA", "")
seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- TIGRIGNA", "")
seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- WOLAYITTA", "")
seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- WOLAYTIGNA", "")
seed_rate_no_lang$logInfo<- str_replace(seed_rate_no_lang$logInfo, "- SIDAMIGNA", "")

#alternative with langauge view
ggplot(seed_rate_no_lang, aes(langId, fill = logInfo)) +
  geom_bar()+
  labs(
    title = 'ALTERNATIVE RAIN MENU/PLANTING/SEED RATE
    content actually played by language
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
    ',
    x = 'Language'
  )

#no language
ggplot(seed_rate_no_lang, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 45, hjust=1))+
  geom_bar()+
  labs(
    title = 'RAIN MENU/PLANTING/SEED RATE
    content actually played',
    x = 'Content Selected',
    y= 'count'
  )

crop_menu <- log_data %>%
  filter(grepl("CROP MENU - ",logInfo)) %>%
  filter(!grepl("HHI",logInfo)) %>%
  filter(!grepl("REPLAYED",logInfo))

crop_menu <- crop_menu %>%
  group_by(callerId, logInfo, langId) %>%
  count()

crop_menu$logInfo<- str_replace(crop_menu$logInfo, "CROP MENU - ", "")
crop_menu$logInfo<- str_replace(crop_menu$logInfo, " SELECTED", "")
crop_menu$logInfo<- str_replace(crop_menu$logInfo, "GO TO", "")


ggplot(crop_menu, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown',
    x = 'Crops',
    y= 'count'
  )


ggplot(crop_menu, aes(langId, fill = logInfo)) +
  geom_bar()+
  labs(
    title = 'CROP MENU BY LANGUAGE
    1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
    ',
    x = 'Language'
  )

num_crop_types <- data.frame(as.numeric(table(crop_menu$callerId)))
num_crop_types$frequencies <- num_crop_types$as.numeric.table.crop_menu.callerId.

summary(num_crop_types$frequencies)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   4.000   4.915   7.000  15.000 
ggplot(num_crop_types, aes(frequencies)) +
  geom_histogram(color="black", fill="red") +
  labs(
    title = 'Distribution of number crops ever selected by individual \n
      Min.  1st Qu.  Median    Mean   3rd Qu.    Max. 
  1.000     2.000     4.000      4.915     7.000     15.000 ',
    x = 'Number of crops selected '
  )

#GETTING BOTH THE CROP MENUS for both rain and hhi
rain_crop_menu <- filter(log_data, grepl("CROP MENU - ",logInfo))
rain_crop_menu <- filter(rain_crop_menu, !grepl("HHI",logInfo))

rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "CROP MENU - ", "")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, " SELECTED", "")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, " PTION", "OPTION")
table(rain_crop_menu$logInfo)

         BARLEY OPTION        CHICKPEA OPTION      COMMON BEANOPTION          COTTON OPTION     CROP MENU REPLAYED     DUREM WHEAT OPTION 
                  1207                    306                    316                   2938                    305                    340 
      FAVA BEAN OPTION GO TO MAIN MENU OPTION          LENTIL OPTION           MAIZE OPTION     MALT BARLEY OPTION            RICE OPTION 
                   514                    549                    147                   2230                    613                    179 
         SESAME OPTION         SORGHUM OPTION             TEF OPTION           WHEAT OPTION 
                   364                    914                   1338                    895 
#ADDING THE NUMBERS
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "BARLEY OPTION", "1 - BARLEY OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "MAIZE OPTION", "2 - MAIZE OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "SORGHUM OPTION", "3 - SORGHUM OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "TEF OPTION", "4 - TEF OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "WHEAT OPTION", "5 - WHEAT OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "SESAME OPTION", "6 - SESAME OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "FAVA BEAN OPTION", "7 - FAVA BEAN OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "CHICKPEA OPTION", "8 - CHICKPEA OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "COMMON BEANOPTION", "9 - COMMON BEAN OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "COTTON OPTION", "10 - COTTON OPTION")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "CROP MENU REPLAYED", "# - CROP MENU REPLAYED")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "GO TO MAIN MENU OPTION", "* - GO TO MAIN MENU OPTION")

#fixes
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "MALT 1 - ", "")
rain_crop_menu$logInfo<- str_replace(rain_crop_menu$logInfo, "DUREM 5 - ", "")



#plotting rain
ggplot(rain_crop_menu, aes(x=fct_infreq(logInfo))) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar(fill='black')+
  geom_text(stat='count', aes(label=..count..), vjust=-1)+
  ylim(0,3200)+
  labs(
    title = 'Rain Crop menu Total Selections with Button Choices',
    x = 'Crops',
    y= 'count'
  )



#getting the HHI MENU
hhi_crop_menu <- filter(log_data, grepl("HHICROP MENU - ",logInfo))
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "HHICROP MENU - ", "")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, " SELECTED", "")
table(hhi_crop_menu$logInfo)

         CARROT OPTION     CROP MENU REPLAYED          GARLIC OPTION GO TO MAIN MENU OPTION    HEAD CABBAGE OPTION    INVALID KEY PRESSED 
                   870                    122                    879                    346                    485                    209 
          ONION OPTION           PAPER OPTION          POTATO OPTION          TOMATO OPTION 
                  1448                    669                   1314                    929 
#ADDING THE NUMBERS
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "POTATO OPTION", "1 - POTATO OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "CARROT OPTION", "2 - CARROT OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "ONION OPTION", "3 - ONION OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "GARLIC OPTION", "4 - GARLIC OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "TOMATO OPTION", "5 - TOMATO OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "PAPER OPTION", "6 - PEPPER OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "HEAD CABBAGE OPTION", "7 - HEAD CABBAGE OPTION")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "CROP MENU REPLAYED", "# - CROP MENU REPLAYED")
hhi_crop_menu$logInfo<- str_replace(hhi_crop_menu$logInfo, "GO TO MAIN MENU OPTION", "* - GO TO MAIN MENU OPTION")

#plotting HHI
ggplot(hhi_crop_menu, aes(x=fct_infreq(logInfo))) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar(fill='brown')+
  geom_text(stat='count', aes(label=..count..), vjust=-1)+
  ylim(0,1750)+
  labs(
    title = 'HHI Crop Menu Total Selections with Button Choices',
    x = 'Crops',
    y= 'count'
  )

NA
NA

#What about a nice crop breakdown per month?


crop_month <- log_data %>%
  filter(grepl("CROP MENU - ",logInfo)) %>%
  filter(!grepl("HHI",logInfo)) %>%
  filter(!grepl("REPLAYED",logInfo))

crop_month <- crop_month %>%
  group_by(callerId, logInfo,month) %>%
  count()

crop_month$logInfo<- str_replace(crop_month$logInfo, "CROP MENU - ", "")
crop_month$logInfo<- str_replace(crop_month$logInfo, " SELECTED", "")
crop_month$logInfo<- str_replace(crop_month$logInfo, "GO TO", "")


crop_track <- crop_month %>%
  filter(month == 1)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown Jan',
    x = 'Crops',
    y= 'count'
  )

  
crop_track <- crop_month %>%
  filter(month == 2)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown feb',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 3)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown mar',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 4)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown april',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 5)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown may',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 6)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown june',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 7)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown july',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 8)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown aug',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 9)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown sep',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 10)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown oct',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 11)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown nov',
    x = 'Crops',
    y= 'count'
  )

crop_track <- crop_month %>%
  filter(month == 12)
ggplot(crop_track, aes(x=logInfo)) +
  theme(axis.text.x = element_text(angle = 60, hjust =1, size = 7))+
  geom_bar()+
  labs(
    title = 'Crop menu breakdown dec',
    x = 'Crops',
    y= 'count'
  )

NA
NA
LS0tCnRpdGxlOiAiUEFELUFUQSBDYWxsIExvZyBBbmFseXNpcyIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyBMaWJyYXJpZXMgdXNlZCBpbiB0aGUgUHJvamVjdCBhbmQgdXBsb2FkaW5nIGRhdGEKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHN2TWlzYykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0YWJsZSkKbGlicmFyeSgiZ2dwdWJyIikKCmxvZ19kYXRhIDwtIHJlYWRfY3N2KCJ+L0Rlc2t0b3AvUEFFL2dpdGh1Yi9kYXRhL2xvZ0RhdGEuY3N2IikKCmxvZ19kYXRhX3NhdmVyIDwtIGxvZ19kYXRhCgpsb2dfZGF0YSA8LSB1bmlxdWUobG9nX2RhdGEpCgpsb2dfZGF0YSRsb2dJbmZvIDwtIHN0cl9yZXBsYWNlKGxvZ19kYXRhJGxvZ0luZm8sICIgICIsICIgIikKCiNNQUtFIElUIEFMTCBVUFBFUiEhIQoKbG9nX2RhdGEkbG9nSW5mbyA8LSB0b3VwcGVyKGxvZ19kYXRhJGxvZ0luZm8pCgojIyMgR0VUVElORyBUSEUgREFURSBNT05USCBBTkQgWUVBUiBJRiBJIFdBTlQhISEKZXh0cmFjdGRhdGUgPC0gZnVuY3Rpb24oZGF0ZSkgewogICAgZGF5IDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVkIikKICAgIG1vbnRoIDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVtIikKICAgIHllYXIgPC0gZm9ybWF0KGRhdGUsIGZvcm1hdD0iJVkiKQoKICAgIGNiaW5kKGRheSwgbW9udGgsIHllYXIpCn0KCiNtYWtpbmcgZmlyc3QgY2FsbHMKZmlyc3RfY2FsbDwtZXh0cmFjdGRhdGUobG9nX2RhdGEkY2FsbFRpbWUpCgoKI21ha2luZyBsYXN0IGNhbGwKbGFzdF9kYXkgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA5LCAxMCkKbGFzdF9tb250aCA8LSBzdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA2LCA3KQpsYXN0X3llYXIgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCAxLCA0KQoKbG9nX2RhdGE8LWNiaW5kKGxvZ19kYXRhLCBmaXJzdF9jYWxsLGxhc3RfZGF5LGxhc3RfbW9udGgsbGFzdF95ZWFyKQoKI0NvbnZlcnRpbmcgY29sdW1ucyB0byBudW1lcmljCmxvZ19kYXRhJGRheSA8LWFzLm51bWVyaWMobG9nX2RhdGEkZGF5KQpsb2dfZGF0YSRsYXN0X2RheSA8LSBhcy5udW1lcmljKGxvZ19kYXRhJGxhc3RfZGF5KQpsb2dfZGF0YSRtb250aCA8LWFzLm51bWVyaWMobG9nX2RhdGEkbW9udGgpCmxvZ19kYXRhJGxhc3RfbW9udGggPC0gYXMubnVtZXJpYyhsb2dfZGF0YSRsYXN0X21vbnRoKQpsb2dfZGF0YSR5ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkeWVhcikKbG9nX2RhdGEkbGFzdF95ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkbGFzdF95ZWFyICkKCgpsb2dfZGF0YSR5ZWFyIDwtIGxvZ19kYXRhJHllYXIgK2xvZ19kYXRhJG1vbnRoLzEyCmxvZ19kYXRhJGxhc3RfeWVhciA8LSBsb2dfZGF0YSRsYXN0X3llYXIgKyBsb2dfZGF0YSRsYXN0X21vbnRoLzEyCgpsb2dfZGF0YSRjYWxsZXJfbGlmZXRpbWUgPC0gbG9nX2RhdGEkbGFzdF95ZWFyIC0gbG9nX2RhdGEkeWVhcgpgYGAKCipDbWQrT3B0aW9uK0kqLgoKICpDbWQrU2hpZnQrSyogCiAKIyMjIFBSRUxJTUlOQVJZIERJU1RSSUJVVElPTlMKIAoqKkluIHRoaXMgc2VjdGlvbiwgd2UgZGlzcGxheSBzb21lIG9mIHRoZSBiYXNpYyBkaXN0cmlidXRpb25zIG9mIHRoZSBkYXRhIGluY2x1ZGluZyBsYW5ndWFnZXMsIHRvdGFsIGxpZmVldGltZSBvZiBhIGdpdmVuIGNhbGxlciwgY29sbHMgbWFkZSwgY29udGVudCBhY2Nlc3NlZCwgYW5kIHRoZSByYXRpbyBvZiBjb250ZW50IGxpc3RlbmVkIHRvIGNhbGxzIG1hZGUuKioKCioqQmFzZWQgb24gdGhlIGdyYXBocyBiZWxvdywgd2UgYXJlIG5lcnZvdXMgdGhhdCBzb21lIG9mIHRoZSBkYXRhIGlzIG5vdCByYW5kb20gZ2l2ZW4gdGhlIGluY3JlZGlibHkgaGlnaCByYXRpbyBmb3IgY29udGVudCBsaXN0ZW5lZCB0byBjYWxscyBtYWRlLCBidXQgZ2l2ZW4gdGhhdCB0aGUgZGF0YSBpcyBkaXN0cmlidXRlZCBmYWlybHkgZXZlbmx5IGFjcm9zcyB0aGVlIGRpZmZlcmVudCBncmFwaHMsIHdlIGFyZSB1bnN1cmUqKgoKYGBge3J9Cmxhbmdfc3Bva2VuIDwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCiNEaXN0cmlidXRpb24gb2YgbGFuZ3VhZ2VzIHNwb2tlbgpnZ3Bsb3QoZGF0YT1sYW5nX3Nwb2tlbiwgYWVzKHg9bGFuZ0lkKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBMYW5ndWFnZXMKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hJywKICAgIHggPSAnTGFuZ3VhZ2UnLAogICAgeT0gJ2NvdW50JwogICkKCgojRGlzdHJpYnV0aW9uIG9mIHRpbWUgZGlmZmVyZW5jZSBiZXd0d2VlbiBmaXJzdCBhbmQgbGFzdCBjYWxsCgpsaWZldGltZTwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBjYWxsZXJfbGlmZXRpbWUpICU+JQogIGNvdW50KCkKCmdncGxvdChkYXRhPWxpZmV0aW1lLCBhZXMoeD1jYWxsZXJfbGlmZXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0nYnJvd24nLCBjb2xvcj0nYmxhY2snKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIENhbGwgTGlmZXRpbWVzJywKICAgIHggPSAnWWVhcnMgYmV0d2VlbiBGaXJzdCBhbmQgTGFzdCBDYWxsJywKICAgIHk9ICdjb3VudCcKICApCgojZGlzdHJpYnV0aW9uIG9mIGNhbGxzIG1hZGUKCmNhbGxzX21hZGUgPC0gbG9nX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIG5vQ2FsbHNNYWRlKSAlPiUKICBjb3VudCgpCgpnZ3Bsb3QoY2FsbHNfbWFkZSwgYWVzKHg9bm9DYWxsc01hZGUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0iYmx1ZSIpICsKICB4bGltKDAsMzUwKSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBjYWxscyBtYWRlIHBlciBpbmRpdmlkdWFsIG92ZXIgbGlmZXRpbWUgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgpNaW4uIDFzdCBRdS4gIE1lZGlhbiAgTWVhbiAgIDNyZCBRdS4gICAgTWF4LiAKICAgIDMuMCAgICA0NS4wICAgIDY5LjAgICAgIDk5LjkgICAgMTA2LjAgICAgNzExMC4wICcsCiAgICB4ID0gJ1RvdGFsIG51bWJlciBvZiBjYWxscycKICApCgpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkNPTlRFTlQiLGxvZ0luZm8pKQpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihjb250ZW50X2xpc3RlbmVkICwgIWdyZXBsKCJDT05URU5UIE1FTlUiLGxvZ0luZm8pKQpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihjb250ZW50X2xpc3RlbmVkICwgIWdyZXBsKCJDT05URU5UIElTIE5PVCBBVkFJTEFCTEUiLGxvZ0luZm8pKQoKI0NyZWF0aW5nIGEgY29udGVudCNfcGxheWVkIGNvbHVtbgpjb250ZW50X2xpc3RlbmVkJGNvbnRlbnRfcGxheWVkIDwtIGlmZWxzZShzdHJfZGV0ZWN0KGNvbnRlbnRfbGlzdGVuZWQkbG9nSW5mbywgJ0NPTlRFTlQgUExBWUVEJywgbmVnYXRlID0gRkFMU0UpLDEsMCkKY29udGVudF9saXN0ZW5lZCRyZXBsYXlfcmVxdWVzdCA8LSBpZmVsc2Uoc3RyX2RldGVjdChjb250ZW50X2xpc3RlbmVkJGxvZ0luZm8sICdDT05URU5UIFJFUExBWSBSRVFVRVNURUQnLCBuZWdhdGUgPSBGQUxTRSksMSwwKQoKY29udGVudF9wbGF5ZWQ8LWFnZ3JlZ2F0ZShjb250ZW50X2xpc3RlbmVkJGNvbnRlbnRfcGxheWVkLGxpc3QoY29udGVudF9saXN0ZW5lZCRjYWxsZXJJZCksIEZVTj1zdW0pCj9yZW5hbWUKY29udGVudF9wbGF5ZWQgPC0gY29udGVudF9wbGF5ZWQgJT4lIAogIGRwbHlyOjpyZW5hbWUoCiAgICBjb25fcGxheSA9IHgsCiAgICBjYWxsZXJJZCA9IEdyb3VwLjEKICAgICkKCmNvbnRlbnRfcmVwbGF5PC1hZ2dyZWdhdGUoY29udGVudF9saXN0ZW5lZCRyZXBsYXlfcmVxdWVzdCxsaXN0KGNvbnRlbnRfbGlzdGVuZWQkY2FsbGVySWQpLCBGVU49c3VtKQpjb250ZW50X3JlcGxheSA8LSBjb250ZW50X3JlcGxheSAlPiUgCiBkcGx5cjo6cmVuYW1lKAogICAgY29uX3JlcGxheSA9IHgsCiAgICBjYWxsZXJJZCA9IEdyb3VwLjEKICAgICkKCmNvbnRlbnRfY291bnRzIDwtIGNiaW5kKGNvbnRlbnRfcGxheWVkLCBjb250ZW50X3JlcGxheSkKCmNvbnRlbnRfY291bnRzJGFkanVzdGVkX2NvbiA8LSBjb250ZW50X2NvdW50cyRjb25fcGxheS1jb250ZW50X2NvdW50cyRjb25fcmVwbGF5Cgpjb250ZW50X2NvdW50cyRjYWxsZXJJZCA8LSBOVUxMCgpzdW1tYXJ5KGNvbnRlbnRfY291bnRzJGFkanVzdGVkX2NvbikKCgojZ3JhcGhpbmcgdGhlIHRydWUgZGlzdHJpYnV0aW9uIG9mIGNvbnRlbnQgcGxheWVkCmdncGxvdChjb250ZW50X2NvdW50cywgYWVzKHg9YWRqdXN0ZWRfY29uKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oMCwxMDApICsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIHRvdGFsIENvbnRlbnQgbGlzdGVuZWQgdG8gYWxsIEFjcm9zcyBhbGwgQ2FsbHMgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgogICAgICBNaW4uIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuIDNyZCBRdS4gICAgTWF4LiAKICAgMC4wMCAgICAzLjAwICAgIDguMDAgICAxNy43OSAgIDIwLjAwICAyNzkuMDAgJywKICAgIHggPSAnVG90YWwgQ29udGVudCBMaXN0ZW4gQWNyb3NzIENhbGxzJwogICkKCgojIEdldHRpbmcgdGhlIG51bWJlciBvZiBjYWxscyBwZXIgcGVyc29uCmNhbGxzX21hZGUgPC0gbG9nX2RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGNhbGxJZCkgJT4lCiAgY291bnQoKQoKY2FsbHNfbWFkZV9pZCA8LSBsb2dfZGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY2FsbElkLCBjYWxsZXJJZCkgJT4lCiAgY291bnQoKQoKCiNqb2luIGJldHdlZW4gdGFibGVzCmNvbnRlbnRfcmF0aW8gPC0gbGVmdF9qb2luKGNhbGxzX21hZGVfaWQsIGNvbnRlbnRfY291bnRzLGJ5PSJjYWxsZXJJZCIpCmNvbnRlbnRfcmF0aW9baXMubmEoY29udGVudF9yYXRpbyldIDwtIDAKCmNvbnRlbnRfcmF0aW8gPC0gY29udGVudF9yYXRpbyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY2FsbGVySWQsIGNvbl9wbGF5LCBjb25fcmVwbGF5LCBhZGp1c3RlZF9jb24pICU+JQogIGNvdW50KCkKCmNvbnRlbnRfcmF0aW8kcmF0aW8gPC0gY29udGVudF9yYXRpbyRhZGp1c3RlZF9jb24vY29udGVudF9yYXRpbyRuCgpzdW1tYXJ5KGNvbnRlbnRfcmF0aW8kcmF0aW8pCgpnZ3Bsb3QoY29udGVudF9yYXRpbywgYWVzKHg9cmF0aW8pKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0icmVkIikgKwogIHhsaW0oMCwyKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIHJhdGlvIG9mIGNvbnRlbnQgbGlzdGVuZWQgdG8gQ2FsbHMgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgpNaW4uIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuIDNyZCBRdS4gICAgTWF4LiAgICAgCiAwLjAwMDAgIDAuNTYxNCAgMS4wMDAwICAxLjI1MDAgIDEuNTI5MiAxMy40MDAwICcsCiAgICB4ID0gJ0NvbnRlbnQgdG8gQ2FsbCBSYXRpbycKICApCgoKc3VtKGNvbnRlbnRfcmF0aW8kbikKYGBgCgojIyMgVE9QIE1FTlUKCioqTmV4dCwgd2Ugd2FudCB0byBCcmVha2QgZG93biB0aGUgaW5pdGlhbCBNZW51IG9wdGlvbnMgYW5kIGRlbHZlIGludG8gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIHNlbGVjdGlvbnMgdGhhdCB0aGUgZmFybWVyIGNhbiBtYWtlIGF0IGEgZGlmZmVyZW50IHN0YXRlIGluIHRoZSBJVlIgU3lzdGVtKioKCioqRm9yIHRoZSBmaXJzdCBhbmFseXNpcywgd2UgbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIFRPUCBNRU5VIGluIHRoZSBkYXRhLiBUaGlzIGNvbWVzIGluIGFzIGZvbGxvd3MqKjoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gQVNTSU5HRUQgVE8gRVhQRVJJTUVOVCAoT1BUSU9OQUwpIC0tPiBUT1AgTUVOVQoKKipUT1AgTUVOVSoqCgogLSBSQUlOIE9QVElPTgogLSBISEkgT1BUSU9OIChob3VzZWhvbGQgSXJyaWdhdGlvbikKIC0gUkVTRVQgUFJPRklMRSBPUFRJT04KIC0gVE9QIE1FTlUgUkVQTEFZCiAtIExJVkVTVE9DSyBPUFRJT04gCiAtIENPVklEIE9QVElPTgogCiAqUGxlYXNlIG5vdGUsIHdlIGFyZSB1bnN1cmUgb2YgdGhlIG9yZGVyIHRoZXNlIGFyZSBwcmVzZW50ZWQuIEZvciBvdGhlciBtZW51cywgd2UgZG8gaGF2ZSB0aGUgb3JkZXIqCiAKICoqQmVsb3csIHdlIGhhdmUgdmlzdWFsaXplZCB0aGUgbnVtYmVyIG9mIGZhcm1lcnMsIG91dCBvZiBvdXIgc2FtcGxlLCB0aGF0IGluIHRoZSBsaWZlIHRpbWUgb2YgdGhlaXIgY2FsbGluZyBoaXN0b3J5IGhhdmUgYWNjZXNzZWQgYSBnaXZlbiBUT1AgTUVOVSBpdGVtIGF0IGxlYXN0IG9uY2UqKgogCiAqKkFkZGl0aW9uYWxseSwgd2UgYWxzbyB2aXN1YWxpemVkIHRoaXMgc2FtZSBzZWxlY3Rpb24gZGl2aWRlZCBieSBsYW5ndWFnZSB0byBzZWUgaWYgdGhlIHBhdHRlcm5zIG9mIHNlbGVjaW9udCBhcmUgc2ltaWxhciBvciBkaWZmZXJlbnQgYWNyb3NzIGxhbmdhdWdlcyoqdgogCmBgYHtyfQojU1RBUlRJTkcgSEVSRSBJUyBGT1IgVU5JUVVFIENBTExFUlMKIyBmaWx0ZXJpbmcgb3V0IHRvcCBNZW51IGtleXMKCnRvcF9tZW51IDwtZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiVE9QIE1FTlUiLGxvZ0luZm8pKQoKI2NsZWFuaW5nIHRoZSBheGlzCnRvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudSRsb2dJbmZvLCAiVE9QIE1FTlUgLSAiLCAiIikKdG9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51JGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQp0b3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnUkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudSRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCgp0b3BfbWVudSA8LSB0b3BfbWVudSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgoKZ2dwbG90KHRvcF9tZW51LCBhZXMobG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIFRPUCBNRU5VIGl0ZW1zIHNlbGVjdGVkIGF0IGxlYXN0IG9uY2UgYnkgYSB1bmlxdWUgY2FsbGVyJywKICAgIHggPSAnVE9QIE1FTlUgb3B0aW9ucycKICApCgpnZ3Bsb3QodG9wX21lbnUsIGFlcyhsYW5nSWQsIGZpbGwgPSBsb2dJbmZvKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIExhbmd1YWdlcyBkaXZpZGVkIGJ5IFRPUCBNRU5VIG9wdGlvbgogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEnLAogICAgeCA9ICdMYW5ndWFnZScKICApCgojU1RBUlRJTkcgSEVSRSBJUyBGT1IgVU5JUVVFIENBTExTCgp0b3BfbWVudV9jYWxsIDwtZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiVE9QIE1FTlUiLGxvZ0luZm8pKQoKI2NsZWFuaW5nIHRoZSBheGlzCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIlRPUCBNRU5VIC0gIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQoKdG9wX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnVfY2FsbCRsb2dJbmZvLCAiUkFJTiBPUFRJT04iLCAiMSAtIFJBSU4gT1BUSU9OIikKdG9wX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnVfY2FsbCRsb2dJbmZvLCAiSEhJIE9QVElPTiIsICIyIC0gSEhJIE9QVElPTiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIkxJVkVTVE9DSyBPUFRJT04iLCAiMyAtIExJVkVTVE9DSyBPUFRJT04iKQp0b3BfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudV9jYWxsJGxvZ0luZm8sICJDT1ZJRCBPUFRJT04iLCAiNCAtIENPVklEIE9QVElPTiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIlJFU0VUIFBST0ZJTEUgT1BUSU9OIiwgIlxcKiAtIFJFU0VUIFBST0ZJTEUiKQp0b3BfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudV9jYWxsJGxvZ0luZm8sICJUT1AgTUVOVSBSRVBMQVlFRCIsICJcXCMgLSBUT1AgTUVOVSBSRVBMQVlFRCIpCgp0b3BfbWVudV9jYWxsIDwtIHRvcF9tZW51X2NhbGwgJT4lCiAgZ3JvdXBfYnkoY2FsbElkLCBsb2dJbmZvKSAlPiUKICBjb3VudCgpCgp0b3BfbWVudV9jYWxsPC0gdG9wX21lbnVfY2FsbFttYXRjaCh1bmlxdWUodG9wX21lbnVfY2FsbCRjYWxsSWQpLCB0b3BfbWVudV9jYWxsJGNhbGxJZCksXQoKZ2dwbG90KHRvcF9tZW51X2NhbGwsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgaGp1c3QgPTEpKSsKICBnZW9tX2Jhcihjb2xvcj0nYmxhY2snLCBmaWxsPSdyZWQnKSsKICBnZW9tX3RleHQoc3RhdD0nY291bnQnLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTEpKwogIHlsaW0oMCw2NTAwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdGlydXRpb24gb2YgVG9wIE1lbnUgT3B0aW9ucyBTZWxlY3RlZCBwZXIgQ2FsbCB3aXRoIE51bWJlciBQcmVzc2VkIEluZGljYXRlZCcsCiAgICB4ID0gJ1RvcCBNZW51IE9wdGlvbnMnLAogICAgeT0nTnVtYmVyIG9mIENhbGxzJwogICkKdW5pcXVlKHRvcF9tZW51X2NhbGwkY2FsbElkKQpjbGFzcyhsb2dfZGF0YSkKYGBgCiAKIAogCioqQXMgd2UgY2FuIGVhc2lseSBzZWUsIHRoZSBSQUlOIG9wdGlvbnMgYW5kIHRoZSBISEkgb3B0aW9uIGRvbWluYXRlIHRoZSBjaG9pY2VzIGZyb20gdGhlIHRvcCBNZW51LiBTbywgd2UgZGVjaWRlZCB0byBkaXZlIGRlZXBlciBpbnRvIGVhY2ggb2YgdGhlc2UgbWVudXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3V0bGllciBzZWxlY3Rpb25zIHRoYXQgYXJlIGRlZXAgd2l0aGluIHRoZSBzeXN0ZW0uIEFkZGl0aW9uYWxseSwgdGhzIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgbGFuZ3VhZ2VzIHNlZW1zIHRvIGJlIGZhaXJseSBjb25zaXN0ZW50IGF0IGZhY2UgdmFsdWUuIFdlIGNhbiBydW4gdGVzdHMgaW4gdGhlIGZ1dHVyZSwgYnV0IGZvciBFREEgdGhpcyB3aWxsIGJlIGFkZXF1YXRlLiBGb3IgMy80IGxhbmdhdWdlIG9wdGlvbnMgLSBoYXZpbmcgbW9yZSBkYXRhIHdvdWxkIGJlIGFwcHJlY2FpdGVkKioKCgojIyMgUkFJTiBNRU5VCgojIyMjIyBJTkNPTUlORyBDQUxMIFNUQVJURUQgLS0+IFdFTENPTUUgTUVTU0FHRSBQTEFZRUQgLS0+IFJBTkRPTSBFWFBFUklNRU5UIC0tPiBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VCgoqKkhlcmUsIHdlIGxvb2sgYXQgdGhlIGJyZWFrZG93biBvZiBpbmRpdmlkdWFscyB3aG8gaGF2ZSBzZWxlY3RlZCBhIGdpdmVuIG9wdGlvbiBpbiB0aGUgcmFpbiBtZW51IGF0IGxlYXN0IG9uY2UuIEluIHRoZSBkYXRhLCBNQUlOIE1FTlUgPT0gUkFJTiBNRU5VLioqCgoKKipSQUlOIE1FTlUqKgoKIC0gUFJFIFBMQU5USU5HIE9QVElPTgogLSBQTEFOVElORyBPUFRJT04KIC0gQ1JPUCBQUk9URUNUSU9OIE9QVElPTgogLSBGRVJUSUxJWkdFUiBTSURFIERSRUVTU0lORwogLSBQT1NUIEhBUlZFU1QgQU5EIFBST0NFU1NJTkcKIC0gUkVQRUFUIFJBSU4gTUVOVQogLSBSRVRVUk4gVE8gVE9QIE1FTlUKIC0gSU5WQUxJRCBLRVkgUFJFU1NFRCAoQURESVRJT05BTCBPVVRDT01FKQoKCgpgYGB7cn0KIyBQdWxsaW5nIG91dCB0aGUgcmFpbiBNZW51IEJ5IENBTExMRVIKCiNSQUlOID09IEhISV9SQUlOCnJhaW5fbWVudSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQpyYWluX21lbnUgPC0gZmlsdGVyKHJhaW5fbWVudSwgIWdyZXBsKCJMSVZFU1RPQ0sgTUFJTiBNRU5VIixsb2dJbmZvKSkKcmFpbl9tZW51IDwtIGZpbHRlcihyYWluX21lbnUsICFncmVwbCgiSEhJIE1BSU4gTUVOVSIsbG9nSW5mbykpCnJhaW5fbWVudSA8LSBmaWx0ZXIocmFpbl9tZW51LCAhZ3JlcGwoIkNPVklELTE5IE1BSU4gTUVOVSIsbG9nSW5mbykpCgojZ3JvdXBpbmcgdGhlIG9ic2VydmF0aW9ucwpyYWluX21lbnUgPC1yYWluX21lbnUgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKcmFpbl9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX21lbnUkbG9nSW5mbywgIk1BSU4gTUVOVSAtICIsICIiKQpyYWluX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudSRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCnJhaW5fbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51JGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQpyYWluX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudSRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKI3Bsb3R0aW5nIHJhaW4gbWVudSBicmVha2Rvd24KZ2dwbG90KGRhdGE9cmFpbl9tZW51LCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0xKSkrCiAgZ2VvbV9iYXIoZmlsbD0nYmx1ZScpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdCcmVha2Rvd24gZm9yIEluZGl2aWR1YWxzIEJ5IENvbnRlbnQgU2VsZWN0ZWQgYXQgbGVhc3QgT25jZSBmcm9tIHRoZSByYWluIG1lbnUnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKCiNET0lORyBJVCBCWSBDQUxMISEhIQpyYWluX21lbnVfY2FsbCA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQpyYWluX21lbnVfY2FsbCA8LSBmaWx0ZXIocmFpbl9tZW51X2NhbGwsICFncmVwbCgiTElWRVNUT0NLIE1BSU4gTUVOVSIsbG9nSW5mbykpCnJhaW5fbWVudV9jYWxsIDwtIGZpbHRlcihyYWluX21lbnVfY2FsbCwgIWdyZXBsKCJISEkgTUFJTiBNRU5VIixsb2dJbmZvKSkKcmFpbl9tZW51X2NhbGwgPC0gZmlsdGVyKHJhaW5fbWVudV9jYWxsLCAhZ3JlcGwoIkNPVklELTE5IE1BSU4gTUVOVSIsbG9nSW5mbykpCgojZ3JvdXBpbmcgdGhlIG9ic2VydmF0aW9ucwpyYWluX21lbnVfY2FsbDwtcmFpbl9tZW51X2NhbGwgJT4lCiAgZ3JvdXBfYnkoY2FsbElkLCBsb2dJbmZvLCkgJT4lCiAgY291bnQoKQoKcmFpbl9tZW51X2NhbGw8LSByYWluX21lbnVfY2FsbFttYXRjaCh1bmlxdWUocmFpbl9tZW51X2NhbGwkY2FsbElkKSwgcmFpbl9tZW51X2NhbGwkY2FsbElkKSxdCgpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIk1BSU4gTUVOVSAtICIsICIiKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnJhaW5fbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX21lbnVfY2FsbCRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNGSXhpbmcgdGhlIEhISSBtZW51IGFuZCBhZGRpbmcgbnVtYmVlcnMKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJQUkUgUExBTlRJTkciLCAiMSAtIFBSRVBMWk5USU5HIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJQTEFOVElORyIsICIyIC0gUExBTlRJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIjEgLSBQUkVQTFpOVElORyIsICIxIC0gUFJFUExBTlRJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIkNST1AgUFJPVEVDVElPTiIsICIzIC0gQ1JPUCBQUk9URUNUSU9OIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJGRVJUSUxJWkVSIFNJREUgRFJFU1NJTkciLCAiNCAtIEZFUlRJTElaRVIgRFJFU1NJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIlBPU1QgSEFSVkVTVCBBTkQgUFJPQ0VTU0lORyIsICI1IC0gUE9TVCBIQVJWRVNUL1BST0NFU1NJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIkdPIFRPIE1BSU4gTUVOVSIsICIqIC0gR08gVE8gTUFJTiBNRU5VIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJNQUlOIE1FTlUgUkVQTEFZRUQiLCAiIyAtIE1BSU4gTUVOVSBSRVBMQVlFRCIpCgojcGxvdHRpbmcgcmFpbiBtZW51IGJyZWFrZG93bgpnZ3Bsb3QoZGF0YT1yYWluX21lbnVfY2FsbCwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9MSkpKwogIGdlb21fYmFyKGNvbG9yPSdibGFjaycsIGZpbGw9J2JsdWUnLHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoIDAuMykpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSkrCiAgeWxpbSgwLDMyNTApKwogIGxhYnMoCiAgICB0aXRsZSA9ICdEaXN0aXJ1dGlvbiBvZiBSYWluIE1lbnUgT3B0aW9ucyBTZWxlY3RlZCBwZXIgQ2FsbCcsCiAgICB4ID0gJ1JhaW4gTWVudSBPcHRpb25zJywKICAgIHk9J051bWJlciBvZiBDYWxscycKICApCgojR0VUVElORyBISEkgTUVOVSBQRVIgQ0FMTApISElfbWVudV9jYWxsIDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkhISSBNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQoKI2dyb3VwaW5nIHRoZSBvYnNlcnZhdGlvbnMKSEhJX21lbnVfY2FsbDwtSEhJX21lbnVfY2FsbCAlPiUKICBncm91cF9ieShjYWxsSWQsIGxvZ0luZm8sKSAlPiUKICBjb3VudCgpCgpISElfbWVudV9jYWxsPC0gSEhJX21lbnVfY2FsbFttYXRjaCh1bmlxdWUoSEhJX21lbnVfY2FsbCRjYWxsSWQpLCBISElfbWVudV9jYWxsJGNhbGxJZCksXQoKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiSEhJIE1BSU4gTUVOVSAtICIsICIiKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNGSXhpbmcgdGhlIEhISSBtZW51IGFuZCBhZGRpbmcgbnVtYmVlcnMKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiUFJFIFBMQU5USU5HIiwgIjEgLSBQUkVQTEFOVElORyIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIlBMQU5USU5HIEFORCBUUkFOU1BMQU5USU5HIiwgIjIgLSBQTEFOVElORy9UUkFOU1BMQU5USU5HIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiSEFSUk9XSU5HIEFORCBFQVJUSE5JTkciLCAiMyAtIEhBUlJPV0lORy9FQVJUSE5JTkciKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJJUlJJR0FUSU5HIENST1BTIiwgIjQgLSBJUlJJR0FUSU5HIENST1BTIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiUFJPVEVDVElORyBDUk9QUyIsICI1IC0gUFJPVEVDVElORyBDUk9QUyIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIkFQUExZSU5HIEZFUlRJTElaRVIiLCAiNiAtIEFQUExZSU5HIEZFUlRJTElaRVIiKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJIQVJWRVNUSU5HIEFORCBQUk9DRVNTSU5HIiwgIjcgLSBIQVJWRVNUSU5HL1BST0NFU1NJTkciKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJHTyBUTyBNQUlOIE1FTlUiLCAiKiAtIEdPIFRPIE1BSU4gTUVOVSIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIkhISSBNQUlOIE1FTlUgUkVQTEFZRUQiLCAiIyAtIEhISSBNQUlOIE1FTlUgUkVQTEFZRUQiKQoKCiNwbG90dGluZyByYWluIG1lbnUgYnJlYWtkb3duCmdncGxvdChkYXRhPUhISV9tZW51X2NhbGwsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPTEpKSsKICBnZW9tX2Jhcihjb2xvcj0nYmxhY2snLCBmaWxsPSdncmVlbicscG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSggMC4zKSkrCiAgZ2VvbV90ZXh0KHN0YXQ9J2NvdW50JywgYWVzKGxhYmVsPS4uY291bnQuLiksIHZqdXN0PS0xKSsKICB5bGltKDAsMTMwMCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIEhISSBNZW51IE9wdGlvbnMgU2VsZWN0ZWQgcGVyIENhbGwnLAogICAgeCA9ICdISEkgTWVudSBPcHRpb25zJywKICAgIHk9J051bWJlciBvZiBDYWxscycKICApCgpgYGAKCgoKKipXZSBjYW4gc2VlIHRoYXQgdGhlIHByZS1wbGFudGluZyBtZW51LCB3aGljaCBzdGlsbCBoYXMgb3ZlciA3NSUgb2YgdW5pcXVlIHVzZXJzIGFjY2Vzc3MgaXQgYXQgbGVhc3Qgb25jZSBleHBlcmVpbmNlcyBpbmNyZWRpYmx5IGhpZ2ggdXNhZ2UuIFNvLCB3ZSBub3cgZGl2ZSBpbnRvIHRoaXMgbWVudS4gV2Ugd2lsbCBicmVha2Rvd24gY29uZW50IHNlbGVjdGlvbiBieSBsYW5ndWFnZSBhbmQgb3ZlcmFsbCoqCgoKIyMjIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcgTUVOVQoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBSQU5ET00gRVhQRVJJTUVOVCAtLT4gCiMjIyMjIFRPUCBNRU5VIC0tPiBSQUlOIE1FTlUgLS0+IFBSRSBQTEFOVElORyBNRU5VCgoqKlBsZWFzZSBub3RlLCB0aGUgcHJlIHBsYW50aW5nIG1lbnUgdW5kZXIgdGhlIHJhaW4gbWVudSBpcyByZWZlcnJlZCB0byBhcyBNRU5VIDEgaW4gdGhlIGRhdGEqKgoKCioqUFJFIFBMQU5USU5HIE1FTlUqKgoKIC0gTEFORCBQUkVQQVJBVElPTgogLSBTRUVEIFZBUklFVFkKIC0gUkVQRUFUIE1FTlUKIC0gR08gVE8gTUFJTiBNRU5VIChSQUlOIE1FTlUpCiAtIElOVkFMSUQgS0VZIChBRERJVElPTkFMIE9VVENPTUUpCiAKIApgYGB7cn0KCgojZmlsdGVyaW5nIG91dCBNRU5VIDEgb3B0aW9ucyBhcyB0aGUgcHJlIHBsYW50aW5nCk1FTlVfMSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNRU5VIDEiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJISElNRU5VIDEiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJBUElDVUxUVVJFIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJBUElDVUxUVVJFIFNVQjQgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkRBSVJZIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJTTUFMTC1TQ0FMRSBTVUI1IE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJEQUlSWSBTVUIyIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJGQVRURU5JTkcgTUFOVSIsbG9nSW5mbykpCgpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJGQVRURU5JTkcgU1VCMSBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiRkFUVEVOSU5HIFNVQjIgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkhPVVNFSE9MRCBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiSE9VU0VIT0xEIFNVQjEgTUVOVSAiLGxvZ0luZm8pKQoKCk1FTlVfMSA8LSBNRU5VXzEgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKTUVOVV8xJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzEkbG9nSW5mbywgIk1FTlUgMSAtICIsICIiKQpNRU5VXzEkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMSRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKTUVOVV8xJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzEkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQoKIyBwbG90dGluZwpnZ3Bsb3QoZGF0YT1NRU5VXzEsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgaGp1c3Q9IDEpKSsKICBnZW9tX2JhcihmaWxsPSdjeWFuJykrCiAgbGFicygKICAgIHRpdGxlID0gJ0luZGl2aWR1YWxzIEJ5IENvbnRlbnQgU2VsZWN0ZWQgYXQgbGVhc3QgT25jZSBmcm9tIAogICAgUkFJTiBNRU5VL1BSRSBQTEFOVElORyBPUFRJT04nLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKCmBgYAoKCiMjIyBSQUlOIE1FTlUvUFJFIFBMQU5USU5HIE1FTlUvTEFORCBQUkVQQVJBVElPTgoKCioqV2UgY29udGludWUgb3VyIHBhdHRlcm4gb2YgZm9sbG93aW5nIHRoZSBtb3N0IGFjY2Vzc2VkIHN1Ym1lbnUgZnJvbSB0aGUgcHJldmlvdXMgc3VibWVudCAtIGxhbmQgcHJlcGFyYXRpb24hIFRoaXMgaXMgYWxzbyB0aGUgYm90dG9tIG9mIGEgdHJlZS4gV2Ugd2lsbCBicmVha2Rvd24gY29uZW50IHNlbGVjdGlvbiBieSBsYW5ndWFnZSBhbmQgb3ZlcmFsbCoqCgoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBSQU5ET00gRVhQRVJJTUVOVCAtLT4gCiMjIyMjIFRPUCBNRU5VIC0tPiBSQUlOIE1FTlUgLS0+IFBSRSBQTEFOVElORyBNRU5VIC0tPiBMQU5EIFBSRVBBUkFUSU9OCgoqKkxBTkQgUFJFUEFSQVRJT04qKgoKIC0gQkFSTEVZCiAtIE1BSVpFCiAtIFNPUkdIVU0KIC0gVEVGCiAtIFdIRUFUCiAtIFNFU0FNRQogLSBGQVZBIEJFQU4KIC0gQ0hJQ0tQRUEKIC0gQ09NTU9OIEJFQU4KIC0gQ09UVE9OCgpPUkRFUiBVTktPV046CgogLSBSSUNFCiAtIERVUkFNRSBXSEVBVAogLSBMRU5USUwKIC0gTUFMVCBCQVJMRVkKIAogCmBgYHtyfQojR0VUVElORyBUSEUgQ1JPUCBNRU5VIEZST00gTUVOVSAxIChyYWluL3ByZXBsYW50aW5nL2xhbmQgcHJlcGFyYXRpb24gc3ViIG1lbnUpCmxhbmRfcHJlcCA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJDT05URU5UIFBMQVlFRCAtIExBTkQgUFJFUEFSQVRJT04gLSAiLGxvZ0luZm8pKQoKbGFuZF9wcmVwX2ZpbmFsIDwtIGxhbmRfcHJlcCAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpsYW5kX3ByZXBfZmluYWwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9maW5hbCRsb2dJbmZvLCAiQ09OVEVOVCBQTEFZRUQgLSBMQU5EIFBSRVBBUkFUSU9OIC0iLCAiIikKCmdncGxvdChkYXRhPWxhbmRfcHJlcF9maW5hbCwgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0yKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BSRSBQTEFOVElORy9MQU5EIFBSRVBBUkFUSU9OCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZScsCiAgICB4ID0gJ0NvbnRlbnQgUGxheWVkJywKICAgIHk9ICdjb3VudCcKICApCgoKI2dldCByaWQgb2YgdGhlIGxhbmd1YWdlIGJyZWFrZG93bgpsYW5kX3ByZXBfbm9fbGFuZyA8LSBsYW5kX3ByZXBfZmluYWwKCmxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvLCAiLSBBTUhBUklDIiwgIiIpCmxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvLCAiLSBPUk9NSUZGQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKbGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm8sICItIFdPTEFZSVRUQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlUSUdOQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCgpnZ3Bsb3QobGFuZF9wcmVwX25vX2xhbmcsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QUkUgUExBTlRJTkcvTEFORCBQUkVQQVJBVElPTgogICAgY29udGVudCBwbGF5ZWQgb3ZlcmFsbCcsCiAgICB4ID0gJ0NvbnRlbnQgUGxheWVkJywKICAgIHk9ICdjb3VudCcKICApCgpnZ3Bsb3QobGFuZF9wcmVwX25vX2xhbmcsIGFlcyhsYW5nSWQsIGZpbGwgPSBsb2dJbmZvKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0FMVEVSTkFUSVZFIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcvTEFORCBQUkVQQVJBVElPTgogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hCiAgICAnLAogICAgeCA9ICdMYW5ndWFnZScKICApCmBgYAogCgoqKkJJRyBUQUtFQVdBWTogMzUlIG9mIHVzZXJzIGVuZCB1cCBhY2Nlc3NpbmcgdGhlIG1haXplIG1lbnUgYXQgc29tZSBwb2ludCEgV2hlYXQsIFRlZiwgU29yZ2h1bSwgYW5kIEJhcmxleSBhbHNvIGFwcGVhciB0byBiZSBxdWFsaXRhdGl2ZWx5IHNpZ25pZmljYW50KioKCioqVGhlcmUgaXMgbm8gbWVudSB0byBnbyBkZWVwZXIgaW4sIHNvIGxldCdzIGdvIGJhY2sgdXAgYSBsZXZlbCBhbmQgY2hlY2sgdG8gc2VlIGlmIG90aGVyIGJyYW5jaGVzIGhhdmUgYSBsb3Qgb2YgYWNjZXNzKioKCgojIyMgUkFJTiBNRU5VL1BSRSBQTEFOVElORyBNRU5VL1NFRUQgVkFSSUVUWQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQUkUgUExBTlRJTkcgTUVOVSAtLT4gU0VFRCBWQVJJRVRZCgoqKlNFRUQgVkFSSUVUWSoqCgogLSBCQVJMRVkKIC0gTUFJWkUKIC0gU09SR0hVTQogLSBURUYKIC0gV0hFQVQKIC0gU0VTQU1FCiAtIEZBVkEgQkVBTgogLSBDSElDS1BFQQogLSBDT01NT04gQkVBTgoKYGBge3J9CiNHRVRUSU5HIFRIRSBDUk9QIE1FTlUgRlJPTSBNRU5VIDEgKHJhaW4vcHJlcGxhbnRpbmcvc2VlZCB2YXJpZXR5IHN1YiBtZW51KQpzZWVkX3ZhcmlldHkgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSBTRUVEIFZBUklUWSIsbG9nSW5mbykpCgpzZWVkX3ZhcmlldHlfZmluYWwgPC0gc2VlZF92YXJpZXR5ICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCnNlZWRfdmFyaWV0eV9maW5hbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X2ZpbmFsJGxvZ0luZm8sICJDT05URU5UIFBMQVlFRCAtIFNFRUQgVkFSSVRZIC0gIiwgIiIpCgpnZ3Bsb3QoZGF0YT1zZWVkX3ZhcmlldHlfZmluYWwsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QUkUgUExBTlRJTkcvU0VFRCBWQVJJRVRZCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZScsCiAgICB4ID0gJ0NvbnRlbnQgU2VsZWN0ZWQnLAogICAgeT0gJ2NvdW50JwogICkKCgojZ2V0IHJpZCBvZiB0aGUgbGFuZ3VhZ2UgYnJlYWtkb3duCnNlZWRfdmFyaWV0eV9ub19sYW5nIDwtIHNlZWRfdmFyaWV0eV9maW5hbAoKc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm8sICItIEFNSEFSSUMiLCAiIikKc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBUSUdSSUdOQSIsICIiKQpzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlJVFRBIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBTSURBTUlHTkEiLCAiIikKCiNhbHRlcm5hdGl2ZSB3aXRoIGxhbmdhdWdlIHZpZXcKZ2dwbG90KHNlZWRfdmFyaWV0eV9ub19sYW5nLCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdBTFRFUk5BVElWRSBSQUlOIE1FTlUvUFJFIFBMQU5USU5HL1NFRSBWQVJJRVRZCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZQogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEKICAgICcsCiAgICB4ID0gJ0xhbmd1YWdlJwogICkKCiNubyBsYW5ndWFnZSAtIG92ZXJhbGwKZ2dwbG90KHNlZWRfdmFyaWV0eV9ub19sYW5nLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0PTEpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSQUlOIE1FTlUvUFJFIFBMQU5USU5HL3NlZWQgdmFyaWV0eQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKYGBgCiAKKipXZSBoYXZlIG1vc3RseSBleGhhdXN0ZWQgdGhlIHByZS1wbGFudGluZyBvcHRpb24gbWVudSwgYW5kIGlmIHdlIGdvIGJhY2sgdXAgdG8gdGhlIG9yaWdpbmFsIHJhaW4gbWVudSAoYWthIE1BSU4gTUVOVSksIHdlIGNhbiBzZWUgdGhhdCBwbGFudGluZyBhbHNvIGhhcyBhIGxhcmdlIHBvcnBvcnRpb24gb2YgdXNlcnMgLSBvdmVyIGhhbGYqKgoKCiMjIyBSQUlOIE1FTlUvUExBTlRJTkcgTUVOVQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQTEFOVElORyBNRU5VCgoqKlRoZSBwbGFudGluZyBvcHRpb24gYXMgYSBzdWJzZWN0aW9uIG9mIHRoZSByYWluIG9wdGlvbiBpcyBrbm93biBhcyBNRU5VIDIgaW4gdGhlIGRhdGEqKgoKUExBTlRJTkcgTUVOVQoKIC0gU0VFRCBSQVRFCiAtIFNPSUwgREVQVEggUExBTlRJTkcKIC0gVFJBTlNQTEFOVElORwogLSBNT0lTVFVSRSBDT05TRVJWQVRJT04KIC0gRkVSVElMSVpFUiBBUFBMSUNBVElPTgogLSBSRVBMQVkgTUVOWQogLSBSRVRVUk4gVE8gUkFJTiBNRU5ZCiAtIElOVkFMSUQgS0VZIChBRERJVElPTkFMIE9VVENPTUUpCiAKCgpgYGB7cn0KI1BMQU5USU5HIE9QVElPTiAtIHNlY29uZCBtb3N0IGFjY2Vzc2VkIE1FTlUgMgpNRU5VXzIgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiTUVOVSAyIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiSEhJTUVOVSAyIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiQVBJQ1VMVFVSRSBNRU5VIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiQVBJQ1VMVFVSRSBTVUIyIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzIgPC0gZmlsdGVyKE1FTlVfMiwgIWdyZXBsKCJEQUlSWSBNRU5VIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiRkFUVEVOSU5HIE1BTlUiLGxvZ0luZm8pKQoKTUVOVV8yIDwtIE1FTlVfMiAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgojY2xlYW5pbmcKTUVOVV8yJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzIkbG9nSW5mbywgIk1FTlUgMiAtICIsICIiKQpNRU5VXzIkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMiRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCk1FTlVfMiRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoTUVOVV8yJGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQpNRU5VXzIkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMiRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNwbG90dGluZwpnZ3Bsb3QoZGF0YT1NRU5VXzIsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpKwogIGdlb21fYmFyKGZpbGw9J29saXZlZHJhYicpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdJbmRpdmlkdWFscyBCeSBDb250ZW50IFNlbGVjdGVkIGF0IGxlYXN0IE9uY2UgZnJvbSAKICAgIFJBSU4gTUVOVS9QTEFOVElORyBPUFRJT04nLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCmBgYAoKCgoqKkFzIHBlciB1c3VhbCwgd2Ugd2lsbCBnbyBpbnRvIHRoZSBtb3N0IGNvbW1vbiBzZWxlY3Rpb246IHNlZWQgcmF0ZSEqKgoKIyMjIFJBSU4gTUVOVS9QTEFOVElORyBNRU5VL1NFRUQgUkFURQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQTEFOVElORyBNRU5VIC0tPiBTRUVEIFJBVEUKCgoqKlNFRUQgUkFURSoqCgogLSBCQVJMRVkKIC0gTUFJWkUKIC0gU09SR0hVTQogLSBURUYKIC0gV0hFQVQKIC0gU0VTQU1FCiAtIEZBVkEgQkVBTgogLSBDSElDS1BFQQogLSBDT01NT04gQkVBTgogLSBDT1RUT04KCk9SREVSIFVOS09XTjoKCiAtIFJJQ0UKIC0gRFVSQU1FIFdIRUFUCiAtIExFTlRJTAogLSBNQUxUIEJBUkxFWQoKYGBge3J9CnNlZWRfcmF0ZSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJDT05URU5UIFBMQVlFRCAtIFNFRUQgUkFURSIsbG9nSW5mbykpCgpzZWVkX3JhdGVfZmluYWwgPC0gc2VlZF9yYXRlICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCnNlZWRfcmF0ZV9maW5hbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX2ZpbmFsJGxvZ0luZm8sICJDT05URU5UIFBMQVlFRCAtIFNFRUQgUkFURSAtIiwgIiIpCgpnZ3Bsb3QoZGF0YT1zZWVkX3JhdGVfZmluYWwsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BMQU5USU5HL1NFRUQgUkFURQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgojZ2V0IHJpZCBvZiB0aGUgbGFuZ3VhZ2UgYnJlYWtkb3duCnNlZWRfcmF0ZV9ub19sYW5nIDwtIHNlZWRfcmF0ZV9maW5hbAoKc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm8sICItIEFNSEFSSUMiLCAiIikKc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBUSUdSSUdOQSIsICIiKQpzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlJVFRBIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBTSURBTUlHTkEiLCAiIikKCiNhbHRlcm5hdGl2ZSB3aXRoIGxhbmdhdWdlIHZpZXcKZ2dwbG90KHNlZWRfcmF0ZV9ub19sYW5nLCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdBTFRFUk5BVElWRSBSQUlOIE1FTlUvUExBTlRJTkcvU0VFRCBSQVRFCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZQogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEKICAgICcsCiAgICB4ID0gJ0xhbmd1YWdlJwogICkKI25vIGxhbmd1YWdlCmdncGxvdChzZWVkX3JhdGVfbm9fbGFuZywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BMQU5USU5HL1NFRUQgUkFURQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgpgYGAKCgoKCmBgYHtyfQpjcm9wX21lbnUgPC0gbG9nX2RhdGEgJT4lCiAgZmlsdGVyKGdyZXBsKCJDUk9QIE1FTlUgLSAiLGxvZ0luZm8pKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJISEkiLGxvZ0luZm8pKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJSRVBMQVlFRCIsbG9nSW5mbykpCgpjcm9wX21lbnUgPC0gY3JvcF9tZW51ICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCmNyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tZW51JGxvZ0luZm8sICJDUk9QIE1FTlUgLSAiLCAiIikKY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21lbnUkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpjcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbWVudSRsb2dJbmZvLCAiR08gVE8iLCAiIikKCgpnZ3Bsb3QoY3JvcF9tZW51LCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24nLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKZ2dwbG90KGNyb3BfbWVudSwgYWVzKGxhbmdJZCwgZmlsbCA9IGxvZ0luZm8pKSArCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ1JPUCBNRU5VIEJZIExBTkdVQUdFCiAgICAxID0gQW1oYXJpYywgMj1Pcm9taWZmYSwgMz1UaWdyaWduYSwgND1Xb2xheWl0dGEsIGFuZCA1PVNpZGFtaWduYQogICAgJywKICAgIHggPSAnTGFuZ3VhZ2UnCiAgKQpudW1fY3JvcF90eXBlcyA8LSBkYXRhLmZyYW1lKGFzLm51bWVyaWModGFibGUoY3JvcF9tZW51JGNhbGxlcklkKSkpCm51bV9jcm9wX3R5cGVzJGZyZXF1ZW5jaWVzIDwtIG51bV9jcm9wX3R5cGVzJGFzLm51bWVyaWMudGFibGUuY3JvcF9tZW51LmNhbGxlcklkLgoKc3VtbWFyeShudW1fY3JvcF90eXBlcyRmcmVxdWVuY2llcykKCmdncGxvdChudW1fY3JvcF90eXBlcywgYWVzKGZyZXF1ZW5jaWVzKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9InJlZCIpICsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIG51bWJlciBjcm9wcyBldmVyIHNlbGVjdGVkIGJ5IGluZGl2aWR1YWwgXG4KICAgICAgTWluLiAgMXN0IFF1LiAgTWVkaWFuICAgIE1lYW4gICAzcmQgUXUuICAgIE1heC4gCiAgMS4wMDAgICAgIDIuMDAwICAgICA0LjAwMCAgICAgIDQuOTE1ICAgICA3LjAwMCAgICAgMTUuMDAwICcsCiAgICB4ID0gJ051bWJlciBvZiBjcm9wcyBzZWxlY3RlZCAnCiAgKQpgYGAKCgpgYGB7cn0KI0dFVFRJTkcgQk9USCBUSEUgQ1JPUCBNRU5VUyBmb3IgYm90aCByYWluIGFuZCBoaGkKcmFpbl9jcm9wX21lbnUgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ1JPUCBNRU5VIC0gIixsb2dJbmZvKSkKcmFpbl9jcm9wX21lbnUgPC0gZmlsdGVyKHJhaW5fY3JvcF9tZW51LCAhZ3JlcGwoIkhISSIsbG9nSW5mbykpCgpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNST1AgTUVOVSAtICIsICIiKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIiBQVElPTiIsICJPUFRJT04iKQp0YWJsZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvKQoKCiNBRERJTkcgVEhFIE5VTUJFUlMKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJCQVJMRVkgT1BUSU9OIiwgIjEgLSBCQVJMRVkgT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJNQUlaRSBPUFRJT04iLCAiMiAtIE1BSVpFIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiU09SR0hVTSBPUFRJT04iLCAiMyAtIFNPUkdIVU0gT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJURUYgT1BUSU9OIiwgIjQgLSBURUYgT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJXSEVBVCBPUFRJT04iLCAiNSAtIFdIRUFUIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiU0VTQU1FIE9QVElPTiIsICI2IC0gU0VTQU1FIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiRkFWQSBCRUFOIE9QVElPTiIsICI3IC0gRkFWQSBCRUFOIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ0hJQ0tQRUEgT1BUSU9OIiwgIjggLSBDSElDS1BFQSBPUFRJT04iKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNPTU1PTiBCRUFOT1BUSU9OIiwgIjkgLSBDT01NT04gQkVBTiBPUFRJT04iKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNPVFRPTiBPUFRJT04iLCAiMTAgLSBDT1RUT04gT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJDUk9QIE1FTlUgUkVQTEFZRUQiLCAiIyAtIENST1AgTUVOVSBSRVBMQVlFRCIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiR08gVE8gTUFJTiBNRU5VIE9QVElPTiIsICIqIC0gR08gVE8gTUFJTiBNRU5VIE9QVElPTiIpCgojZml4ZXMKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJNQUxUIDEgLSAiLCAiIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJEVVJFTSA1IC0gIiwgIiIpCgoKCiNwbG90dGluZyByYWluCmdncGxvdChyYWluX2Nyb3BfbWVudSwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcihmaWxsPSdibGFjaycpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSkrCiAgeWxpbSgwLDMyMDApKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSYWluIENyb3AgbWVudSBUb3RhbCBTZWxlY3Rpb25zIHdpdGggQnV0dG9uIENob2ljZXMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKCiNnZXR0aW5nIHRoZSBISEkgTUVOVQpoaGlfY3JvcF9tZW51IDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkhISUNST1AgTUVOVSAtICIsbG9nSW5mbykpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIkhISUNST1AgTUVOVSAtICIsICIiKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKdGFibGUoaGhpX2Nyb3BfbWVudSRsb2dJbmZvKQoKI0FERElORyBUSEUgTlVNQkVSUwpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJQT1RBVE8gT1BUSU9OIiwgIjEgLSBQT1RBVE8gT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ0FSUk9UIE9QVElPTiIsICIyIC0gQ0FSUk9UIE9QVElPTiIpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIk9OSU9OIE9QVElPTiIsICIzIC0gT05JT04gT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiR0FSTElDIE9QVElPTiIsICI0IC0gR0FSTElDIE9QVElPTiIpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIlRPTUFUTyBPUFRJT04iLCAiNSAtIFRPTUFUTyBPUFRJT04iKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJQQVBFUiBPUFRJT04iLCAiNiAtIFBFUFBFUiBPUFRJT04iKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJIRUFEIENBQkJBR0UgT1BUSU9OIiwgIjcgLSBIRUFEIENBQkJBR0UgT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ1JPUCBNRU5VIFJFUExBWUVEIiwgIiMgLSBDUk9QIE1FTlUgUkVQTEFZRUQiKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJHTyBUTyBNQUlOIE1FTlUgT1BUSU9OIiwgIiogLSBHTyBUTyBNQUlOIE1FTlUgT1BUSU9OIikKCiNwbG90dGluZyBISEkKZ2dwbG90KGhoaV9jcm9wX21lbnUsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoZmlsbD0nYnJvd24nKSsKICBnZW9tX3RleHQoc3RhdD0nY291bnQnLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTEpKwogIHlsaW0oMCwxNzUwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnSEhJIENyb3AgTWVudSBUb3RhbCBTZWxlY3Rpb25zIHdpdGggQnV0dG9uIENob2ljZXMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKYGBgCgoKYGBge3J9CgojIFRPVEFMIENST1BTIEJZIENPTkVOVCBQTEFZRURFIEVWRVIhISEhCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSAiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkxJVkVTVE9DSyIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiQVBJQ1VMVFVSRSIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiQ09WSUQiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkRBSVJZIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJGQU1JTFkiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkNBVFRMRSIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiRkFUVEVOSU5HIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJQT1VMVFJZIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJTQUZFIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJNSVNDT05DRVBUSU9OUyIsbG9nSW5mbykpCgojZ2V0dGluZyByaWQgb2YgdGhlIGxhbmd1YWdlcy9jb250ZW50CmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gQU1IQVJJQyIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiLSBXT0xBWUlUVEEiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNPTlRFTlQgUExBWUVEIC0gIiwgIiIpCgojZ2V0dGluZyByaWQgb2YgbWVudSBsYWJlbHMKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQVBQTFlJTkcgRkVSVElMSVpFUiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJESVNFQVNFIENPTlRST0wgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiRkVSVElMSVpFUiBBUFBMSUNBVElPTiBSQVRFIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkZFUlRJTElaRVIgU0lERSBEUkVTU0lORyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJIQVJST1dJTkcgQU5EIEVBUlRITklORyBVUCAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJIQVJWRVNUSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhBUlZFU1RJTkcgVEVDSE5JUVVFIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhPVyBUTyBBREQgV0FURVIgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiSE9XIFRPIFBMQU5UIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhPVyBUTyBTRUxFQ1QgQU5EIEJVWSBTRUVEUyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJJTlNFQ1QgQ09OVFJPTCAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJMQU5EIFBSRVBBUkFUSU9OIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1BTkFHSU5HIFdFRURTIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1PSVNUVVJFIENPTlNFUlZBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJPUFRJTVVNIFNQQUNJTkcgQkVUV0VFTiBST1dTIEFORCBQTEFOVFMgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUExPVCBQUkVQQVJBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJQUkUtSVJSSUdBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJQUk9DRVNTSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlxcKCIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJcXCkiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUFJPQ0VTU0lORyBISEkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUFJPVEVDVElPTiBPTiBJTlNFQ1RTIEFORCBESVNFQVNFUyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTRUVEIFJBVEUgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiU0VFRCBWQVJJVFkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiU0VFRCBWQVJJVFkgLSIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTT0lMIERFUFRIIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlNPSUwgREVQVEggLSIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJUSFJFU0hJTkcgQU5EIENMRUFOSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlRSQU5TUExBTlRJTkcgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0VFRCBDT05UUk9MIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldIRU4gQU5EIEhPVyBNVUNIIFdBVEVSIFRPIEFERCAtIERFR0EgLSBDTEFZIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gREVHQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIENMQVkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gREVHQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIENMQVkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBUTyBIQVJWRVNUIC0gIiwgIiIpCgojZml4aW5nIGV4dHJhIGNoYW5nZXMKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIiAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldDIiwgIkMiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZV9hbGwoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0ciLCAiRyIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlX2FsbChjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXTyIsICJPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldQIiwgIlAiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZV9hbGwoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV1QiLCAiVCIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlX2FsbChjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXSEVBRENBQkJBR0UiLCAiSEVBRENBQkJBR0UiKQoKI0FERElORyBUSEUgTlVNQkVSUwojQURESU5HIFRIRSBOVU1CRVJTCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlBPVEFUTyIsICIxIC0gUE9UQVRPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQ0FSUk9UIiwgIjIgLSBDQVJST1QiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJPTklPTiIsICIzIC0gT05JT04iKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJHQVJMSUMiLCAiNCAtIEdBUkxJQyIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlRPTUFUTyIsICI1IC0gVE9NQVRPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUEVQUEVSIiwgIjYgLSBQRVBQRVIgT1BUSU9OIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiSEVBRENBQkJBR0UiLCAiNyAtIEhFQUQgQ0FCQkFHRSIpCgoKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQkFSTEVZIiwgIjEgLSBCQVJMRVkiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJNQUlaRSIsICIyIC0gTUFJWkUiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTT1JHSFVNIiwgIjMgLSBTT1JHSFVNIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiVEVGIiwgIjQgLSBURUYiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXSEVBVCIsICI1IC0gV0hFQVQiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTRVNBTUUiLCAiNiAtIFNFU0FNRSIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkZBVkEgQkVBTlMiLCAiNyAtIEZBVkEgQkVBTiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNISUNLUEVBIiwgIjggLSBDSElDS1BFQSIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNPTU1PTkJFQU5TIiwgIjkgLSBDT01NT04gQkVBTlMiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJDT1RUT04iLCAiMTAgLSBDT1RUT04iKQoKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiRFVSQU1FNSAtIFdIRUFUIiwgIkRVUkFNRSBXSEVBVCIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1BTFQxIC0gQkFSTEVZIiwgIk1BTFQgQkFSTEVZIikKCgoKP2dlb21fdGV4dApnZ3Bsb3QoY29udGVudF9jcm9wX3BsYXllZCwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcihmaWxsPSdza3kgYmx1ZScpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSxzaXplPTMpKwogIHlsaW0oMCwyNzUwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQUxMIENyb3BzIEV2ZXIgQWNjZXNzZWQgQWNyb3NzIEFsbCBDYWxscyB3aXRoIExhYmVsZWQgQnV0dG9ucycsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmBgYAoKCgoKCiNXaGF0IGFib3V0IGEgbmljZSBjcm9wIGJyZWFrZG93biBwZXIgbW9udGg/CmBgYHtyfQoKY3JvcF9tb250aCA8LSBsb2dfZGF0YSAlPiUKICBmaWx0ZXIoZ3JlcGwoIkNST1AgTUVOVSAtICIsbG9nSW5mbykpICU+JQogIGZpbHRlcighZ3JlcGwoIkhISSIsbG9nSW5mbykpICU+JQogIGZpbHRlcighZ3JlcGwoIlJFUExBWUVEIixsb2dJbmZvKSkKCmNyb3BfbW9udGggPC0gY3JvcF9tb250aCAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbyxtb250aCkgJT4lCiAgY291bnQoKQoKY3JvcF9tb250aCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tb250aCRsb2dJbmZvLCAiQ1JPUCBNRU5VIC0gIiwgIiIpCmNyb3BfbW9udGgkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbW9udGgkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpjcm9wX21vbnRoJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21vbnRoJGxvZ0luZm8sICJHTyBUTyIsICIiKQoKCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBKYW4nLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQogIApjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDIpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gZmViJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAzKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIG1hcicsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNCkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBhcHJpbCcsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBtYXknLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDYpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24ganVuZScsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNykKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBqdWx5JywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA4KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIGF1ZycsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gOSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBzZXAnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDEwKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIG9jdCcsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMTEpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gbm92JywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAxMikKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBkZWMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKCmBgYAoK